考慮以下程式碼片段,它使用 struct{} 類型的通道來促進 goroutine 之間的通訊:
package main import "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 } }
[問題1]
done
一個空結構struct 是一個沒有任何欄位的結構體。它也稱為匿名結構。空結構體的目的是提供一種創建沒有字段的類型的方法,這對於各種原因都很有用,例如:
在我們的程式碼中,我們使用匿名結構來表示Goroutine 已完成其工作。為此目的使用空結構體是有利的,因為它的大小為 0,可以最大限度地減少記憶體佔用。
[問題 2]
_ = range langs 的行{
透過使用 struct{} 類型的通道和空結構體作為訊號機制,我們可以以最小的開銷實現 goroutine 之間的高效通訊.
以上是Go 中的匿名結構與空結構:為什麼要用 struct{} 進行 Goroutine 同步?的詳細內容。更多資訊請關注PHP中文網其他相關文章!