php Xiaobian Yuzai がスライスに関する質問を明らかにします。チャネルとゴルーチンを通じて書き込まれたスライスが最終的に空になるのはなぜですか? Go では、チャネルとゴルーチンは同時プログラミングのための重要なツールですが、場合によっては、それらを使用してスライスを作成すると、予期しない結果が生じる可能性があります。この記事では、この問題の原因を詳細に説明し、この状況をよりよく理解して対処するのに役立つ解決策を提供します。
この関数を実行します:
リーリーしかし、最終的に、私の vertices
スライスは空です:
writer
を返す関数は次のようになります:
私の vertices
スライスが空になる理由を理解できる人はいますか?
スライスが実際に設定されていることが示されています。しかし、何らかの理由で、doublecheckvertices
に渡されると空になります。
<pre class="brush:golang;toolbar:false;">func run() () {
// this slice is going to be filled out by a channel and goroutine.
vertices := make([]vertex, 0)
var wg sync.waitgroup
// obtain a writer to fill out the vertices.
writer := writer(&wg, vertices)
// run an arbitrary logic to send data to writer.
logic(writer)
// stop the writer reading on the channel.
close(writer)
// wait for the write to complete.
wg.wait()
// see if vertices slice is actually filled out.
doublecheckvertices(vertices)
}
</pre>
」と似ています。 外部で作成したスライスを goroutine で変更したい場合は、スライスへのポインタが必要です。 リーリー
以上がチャネルとゴルーチンを介したスライスへの書き込み: スライスが空になる理由の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。