http://play.golang.org/p/vhaKi5uVmmpackage mainimport "fmt"var battle = make(chan string)func warrior(name string, done chan struct{}) { select { case opponent := <-battle: fmt.Printf("%s beat %s\n", name, opponent) case battle <- name: // I lost :-( } done <- struct{}{}}func main() { done := make(chan struct{}) langs := []string{"Go", "C", "C++", "Java", "Perl", "Python"} for _, l := range langs { go warrior(l, done) } for _ = range langs { <-done }}[第一個問題] done <- struct{}{}我們如何以及為什么需要這個看起來很奇怪的結構?它是空結構還是匿名結構?我用谷歌搜索但找不到正確的答案或文檔來解釋這一點。原始來源來自 Andrew Gerrand 的演講 http://nf.wh3rd.net/10things/#10這里 make(chan struct{})done 是 struct{} 類型的通道所以我試過 done <- struct{}但它不起作用。為什么我需要為這條線添加一個額外的括號? done <- struct{}{}[第二個問題] for _ = range langs { <-done }為什么我需要這條線?我知道這條線是必要的,因為沒有這條線,就沒有輸出。但是為什么這條線有什么作用呢?是什么讓它在這段代碼中變得必要?我知道這<-done是從完成的通道接收值并丟棄接收到的值。但為什么我需要這樣做?
3 回答

暮色呼如
TA貢獻1853條經驗 獲得超9個贊
復合文字
復合文字為結構體、數組、切片和映射構造值,并在每次評估它們時創建一個新值。它們由值的類型后跟花括號綁定的復合元素列表組成。元素可以是單個表達式或鍵值對。
struct{}{}
是 type 的復合文字,struct{}
值的類型后跟一個括號綁定的復合元素列表。
for _ = range langs { <-done }
正在等待,直到所有 goroutine 的所有 goroutinelangs
都發送了done
消息。

慕桂英4014372
TA貢獻1871條經驗 獲得超13個贊
struct{}
是一種類型(特別是沒有成員的結構)。如果您有類型Foo
,則可以在表達式中創建該類型的值Foo{field values, ...}
。把它們放在一起,struct{}{}
是一個類型的值struct{}
,這是通道所期望的。該
main
函數產生warrior
goroutines,done
當它們完成時將寫入通道。最后一個for
塊從此通道讀取,確保main
在所有 goroutine 完成之前不會返回。這很重要,因為程序將在main
完成時退出,而不管是否有其他 goroutine 在運行。
- 3 回答
- 0 關注
- 308 瀏覽
添加回答
舉報
0/150
提交
取消