第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

為什么通道不關(guān)閉?

為什么通道不關(guān)閉?

Go
慕桂英3389331 2022-06-01 16:19:16
對(duì)于以下代碼:package mainimport "fmt"func emit(c chan string) {    words := []string{"The", "quick", "brown", "fox", "ran", "away"}    for _, word := range words {        fmt.Printf("send %s\n", word)        c <- word    }    fmt.Printf("Close the channel\n")    close(c)}func main() {    wordChannel := make(chan string)    go emit(wordChannel)    word := <-wordChannel    fmt.Printf("receive %s \n", word)    word = <-wordChannel    fmt.Printf("receive %s \n", word)    word = <-wordChannel    fmt.Printf("receive %s \n", word)    word, ok := <-wordChannel    fmt.Printf("receive %s %t\n", word, ok)    word, ok = <-wordChannel    fmt.Printf("receive %s %t\n", word, ok)    word, ok = <-wordChannel    fmt.Printf("receive %s %t\n", word, ok)}下面是輸出:send Thesend quickreceive The receive quick send brownsend foxreceive brown receive fox truesend ransend awayreceive ran truereceive away true為什么發(fā)件人 go-routine 不關(guān)閉通道?
查看完整描述

1 回答

?
翻閱古今

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超5個(gè)贊

你的maingoroutine 在沒(méi)有與 emit goroutine 協(xié)調(diào)的情況下結(jié)束以知道它已經(jīng)完成。當(dāng)?shù)竭_(dá)結(jié)束時(shí)main,程序 - 以及它的所有 goroutines - 都會(huì)結(jié)束,無(wú)論是否有任何 goroutine 仍在處理中,除非你明確地等待它們。


關(guān)閉通道有助于將goroutine 的完成情況傳達(dá)給. 在這種情況下,使用從通道讀取的二值響應(yīng),如emitmain


word, ok = <-wordChannel

確實(shí)將通道的狀態(tài)(打開或關(guān)閉)暴露給main,但您從不使用它來(lái)控制 main 的流。此外,您有一個(gè)確切的硬編碼到 main中的讀取次數(shù)。因此,即使您使用通道關(guān)閉來(lái)控制流量,您也永遠(yuǎn)不會(huì)嘗試最終讀取以查看關(guān)閉的通道。


幸運(yùn)的是,使用 go 的解決方案非常簡(jiǎn)單。 range在一個(gè) go 通道上 ing 將讀取值,直到通道關(guān)閉。因此,您可以簡(jiǎn)化您的代碼,刪除通道接收的顯式數(shù)量,并使用通道 close 來(lái)表示emit完成,所有這些都使用這個(gè)更簡(jiǎn)潔的版本:


package main


import "fmt"


func emit(c chan string) {

    words := []string{"The", "quick", "brown", "fox", "ran", "away"}


    for _, word := range words {

        fmt.Printf("send %s\n", word)

        c <- word

    }

    fmt.Printf("Close the channel\n")

    close(c)

}


func main() {

    wordChannel := make(chan string)

    go emit(wordChannel)

    for word := range wordChannel {

      fmt.Printf("receive %s \n", word)

    }

}

當(dāng)我運(yùn)行它時(shí),我得到了我認(rèn)為是您想要的輸出:


$ go run t.go

send The

send quick

receive The

receive quick

send brown

send fox

receive brown

receive fox

send ran

send away

receive ran

receive away

Close the channel

這個(gè)“ rangeover a channel”語(yǔ)法在概念上等同于這樣的東西,只是看起來(lái)更優(yōu)雅一點(diǎn):


func main() {

    wordChannel := make(chan string)

    go emit(wordChannel)

    for {

      if word, ok := <-wordChannel; ok {

        fmt.Printf("receive %s \n", word)

      } else {

        break

      }

  }

}


查看完整回答
反對(duì) 回復(fù) 2022-06-01
  • 1 回答
  • 0 關(guān)注
  • 110 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)