ホームページ >バックエンド開発 >Golang >チャネルとゴルーチンを介したスライスへの書き込み: スライスが空になる理由

チャネルとゴルーチンを介したスライスへの書き込み: スライスが空になる理由

王林
王林転載
2024-02-11 18:50:081263ブラウズ

通过通道和 goroutine 写入切片:为什么切片最终为空

php Xiaobian Yuzai がスライスに関する質問を明らかにします。チャネルとゴルーチンを通じて書き込まれたスライスが最終的に空になるのはなぜですか? Go では、チャネルとゴルーチンは同時プログラミングのための重要なツールですが、場合によっては、それらを使用してスライスを作成すると、予期しない結果が生じる可能性があります。この記事では、この問題の原因を詳細に説明し、この状況をよりよく理解して対処するのに役立つ解決策を提供します。

質問の内容

この関数を実行します:

リーリー

しかし、最終的に、私の vertices スライスは空です:

リーリー

writer を返す関数は次のようになります:

リーリー

私の vertices スライスが空になる理由を理解できる人はいますか?

###ログ###

ログには、

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(&amp;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 サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。