Go では、go キーワードで呼び出された関数に引数を渡すと、これらの引数はメインのゴルーチンで評価されます。これは、引数として渡された変数は、新しく作成されたゴルーチン内で関数が実行されるときではなく、即時に評価されることを意味します。
問題のコードは「 Go プログラミング言語」では、input.Text() は go echo() ゴルーチンに渡される関数の引数であるため、メインのゴルーチンで評価されると説明しています。その結果、echo() ゴルーチンが開始される前に、入力はメインのゴルーチンで読み取られて処理されます。
func handleConn(c net.Conn) { input := bufio.NewScanner(c) for input.Scan() { go echo(c, input.Text(), 1*time.Second) } }
上記の例では、input.Text() は、入力バッファ。接続からテキストの次の行を読み取って返します。これは echo() への引数であるため、ゴルーチンが開始される前に評価され、実際のテキスト入力が echo() 関数で利用できることが保証されます。
関数の引数がいつ評価されるかを理解することは、ゴルーチンベースのプログラムの同期とデータの一貫性にとって重要です。メインのゴルーチンの引数を評価することで、Go はゴルーチンに渡される値が最新でスレッドセーフであることを保証します。
ゴルーチン内の関数の引数の評価は、一貫性の維持に役立ちます。競合状態を防ぎます。すべての引数の評価をメインの goroutine で実行することで、Go は同時操作で古いデータや一貫性のないデータを使用するリスクを排除します。
以上がGo ゴルーチンで関数の引数はいつ評価されますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。