ゴルーチンからの戻り値のキャッチ
従来の関数呼び出しとは異なり、ゴルーチンは非同期で実行されます。その結果、コード スニペットに見られるように、ゴルーチンの戻り値を変数に直接格納しようとすると、コンパイル エラーが発生します。
エラーの理由
このエラーは、非同期実行と即時値の取得の矛盾する性質から発生します。 go で goroutine を使用する場合、関数の完了を待たずに非同期で関数を実行するようにプログラムに指示します。ただし、戻り値を変数に割り当てるには、その値がすぐに利用可能である必要があります。
チャネル: 非同期値渡しメカニズム
この制限を回避するために、チャネルはゴルーチン間の値交換の仲介者として。チャネルを使用すると、あるゴルーチンから別のゴルーチンに値を送信でき、同時実行性を損なうことなく非同期の値の取得が可能になります。
以下のコードに例示されているようにチャネルベースのアプローチを実装すると、ゴルーチンの値を損なうことなくゴルーチンから値を受け取ることができます。非同期性質:
func main() { c1 := make(chan string) c2 := make(chan string) go func() { time.Sleep(time.Second * 1) c1 <- "one" }() go func() { time.Sleep(time.Second * 2) c2 <- "two" }() for i := 0; i < 2; i++ { // Receive values from both channels concurrently select { case msg1 := <-c1: fmt.Println("received", msg1) case msg2 := <-c2: fmt.Println("received", msg2) } } }
メッセージパッシングと CSP 理論
Go のメッセージング システムは、CSP (Communicating Sequential Processes) 理論からインスピレーションを得ています。このアプローチは、独立したプロセス間の主要な通信メカニズムとしてメッセージ パッシングを促進します。サンプルコードは、ゴルーチン間の非同期通信にチャネルを利用することで CSP の原則に従っています。
以上がGo で非同期に実行されているゴルーチンから戻り値を取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。