チャネルはパイプラインに似ています。ゴルーチンの同期と通信で役割を果たします。また、Golang の CSP モデルの鍵でもあります。
golang のほとんどの型は値型です (参照型はスライス/チャネル/マップのみ) 読み取り/書き込み型が値型のチャネルの場合、要素サイズが比較的大きい場合はポインタを使用する必要があります頻繁なメモリ コピーのオーバーヘッドを回避します。
Golang のチャネルが閉じられているかどうかを判断する方法:
チャネルを読み取るときにチャネルが閉じられているかどうかを判断します
_,ok := <- jobs
この時点でチャネルがクローズされている場合 Close, ok 値は false
チャネルへの書き込み時にクローズされているかどうかを判断します
1, _,ok := <- jobs
この時点でチャネルが閉じられている場合、ok 値は false です。チャネルが閉じられていない場合、1 つのジョブが失われます。
2. select メソッドを使用します。
を使用して、タイムアウトと呼ばれる別のチャネルを作成します。タイムアウトになった場合は、このチャネルに true を送信し、プロデューサ内のジョブのチャネルにデータを送信します。選択を使用してタイムアウトを監視し、タイムアウトになった場合は、
go func() { time.Sleep(time.Second * 3) timeout <- true }()
go func() { for i := 0; ; i++ { select { case <-timeout: close(jobs) return default: jobs <- i fmt.Println("produce:", i) } } }()
golang の知識について詳しくは、golang チュートリアル コラムをご覧ください。
以上がgolang はチャネルが閉じられたことをどのように判断しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。