亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

匿名結構體和空結構體

匿名結構體和空結構體

Go
肥皂起泡泡 2021-07-09 14:07:28
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消息。


查看完整回答
反對 回復 2021-07-12
?
慕桂英4014372

TA貢獻1871條經驗 獲得超13個贊

  1. struct{}是一種類型(特別是沒有成員的結構)。如果您有類型Foo,則可以在表達式中創建該類型的值Foo{field values, ...}。把它們放在一起,struct{}{}是一個類型的值struct{},這是通道所期望的。

  2. main函數產生warriorgoroutines,done當它們完成時將寫入通道。最后一個for塊從此通道讀取,確保main在所有 goroutine 完成之前不會返回。這很重要,因為程序將在main完成時退出,而不管是否有其他 goroutine 在運行。


查看完整回答
反對 回復 2021-07-12
  • 3 回答
  • 0 關注
  • 308 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號