次のコード スニペットを考えてみましょう。これは、ゴルーチン間の通信を容易にするために struct{} 型のチャネルを使用します。
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
これは匿名の構造体ですか、それとも空の構造体ですか? 空の構造体
はフィールドを持たない構造体です。これは使用できる型を作成する方法としてマップ内のキーとして
コードでは、匿名構造体を使用してゴルーチンが作業を終了したことを通知します。この目的で空の構造体を使用すると、サイズが 0 でメモリ フットプリントが最小限に抑えられるため、有利です。
[質問 2]
ループは、done チャネルから値を受け取りますが、_ ワイルドカード変数を使用して値を破棄します。これは、ゴルーチンによって送信される実際の値には興味がないためです。すべてのゴルーチンが完了を通知するまで待ちたいだけです。
シグナル伝達メカニズムとして struct{} 型のチャネルと空の構造体を使用することで、最小限のオーバーヘッドでゴルーチン間の効率的な通信を実現できます。 .以上がGo の匿名構造体と空の構造体: Goroutine の同期に「struct{}」を使用する理由の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。