ホームページ > バックエンド開発 > Golang > Go の匿名構造体と空の構造体: Goroutine の同期に「struct{}」を使用する理由

Go の匿名構造体と空の構造体: Goroutine の同期に「struct{}」を使用する理由

DDD
リリース: 2025-01-04 05:10:39
オリジナル
830 人が閲覧しました

Anonymous Structs vs. Empty Structs in Go: Why Use `struct{}` for Goroutine Synchronization?

Go における匿名構造体と空の構造体

次のコード スニペットを考えてみましょう。これは、ゴルーチン間の通信を容易にするために 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

  • done チャネルに空の構造体を送信する行、done <- struct{}{} が混乱を引き起こしました。通常の構造体は struct { /* フィールド */ } で宣言できますが、空の構造体は struct{}{} で示され、次のようないくつかの疑問が生じます。
  • なぜこの構文が必要なのでしょうか?

これは匿名の構造体ですか、それとも空の構造体ですか? 空の構造体

はフィールドを持たない構造体です。これは
    匿名構造体
  • としても知られています。空の構造体の目的は、フィールドを持たない型を作成する方法を提供することです。これは、次のようなさまざまな理由で役立ちます。
  • 追加される型のプレースホルダーとして将来的には
  • 同期に使用できる独自の型を作成する方法として

使用できる型を作成する方法としてマップ内のキーとして

コードでは、匿名構造体を使用してゴルーチンが作業を終了したことを通知します。この目的で空の構造体を使用すると、サイズが 0 でメモリ フットプリントが最小限に抑えられるため、有利です。

[質問 2]

  • _ = range langs の行{ <-done } は、done チャネルからの値の受信と破棄を担当します。この行は次の理由で必要です。
  • この行がないと、他のゴルーチンが作業を完了する前にメインの goroutine が終了してしまうため、プログラムは出力を生成しません。

ループは、done チャネルから値を受け取りますが、_ ワイルドカード変数を使用して値を破棄します。これは、ゴルーチンによって送信される実際の値には興味がないためです。すべてのゴルーチンが完了を通知するまで待ちたいだけです。

シグナル伝達メカニズムとして struct{} 型のチャネルと空の構造体を使用することで、最小限のオーバーヘッドでゴルーチン間の効率的な通信を実現できます。 .

以上がGo の匿名構造体と空の構造体: Goroutine の同期に「struct{}」を使用する理由の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート