ホームページ >バックエンド開発 >Golang >ゴルーチン内で呼び出された関数の戻り値はどうなりますか?

ゴルーチン内で呼び出された関数の戻り値はどうなりますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-06 07:49:14817ブラウズ

What Happens to the Return Values of Functions Called within Goroutines?

ゴルーチンからの戻り値はどうなりますか?

ゴルーチンから関数を呼び出すと、ゴルーチンには通常、戻り値が失われます。独自の隔離された実行環境。関数は戻り値をスタックに格納できますが、このスタックはメイン プログラムのスタックから分離されており、ゴルーチンが終了すると破棄されます。

関数の戻り値の分析

-gcflags -S フラグを使用して getNumber 関数のアセンブリ出力を調べると、戻り値がstack:

"".getNumber t=1 size=16 value=0 args=0x10 locals=0x0
    0x0000 00000 (z.go:5)   TEXT    "".getNumber+0(SB),4,<pre class="brush:php;toolbar:false">func getNumber(i int) int {
    return i
}

func main() {
    for i := 0; i < 10; i++ {
        go printNumber(i)
    }
    time.Sleep(5)
}
-16 0x0000 00000 (z.go:6) MOVQ "".i+8(FP),BX 0x0005 00005 (z.go:6) MOVQ BX,"".~r1+16(FP) 0x000a 00010 (z.go:6) RET

ただし、この値はゴルーチン内の新しいスタックに保存され、その後ゴルーチンが終了すると破棄されるため、メイン プログラムから戻り値にアクセスできなくなります。

次のことを考えてみましょうcode:

func getNumber(i int) chan int {
    ch := make(chan int)
    go func() {
        ch <- i
    }()
    return ch
}

func main() {
    for i := 0; i < 10; i++ {
        ch := getNumber(i)
        num := <-ch
        fmt.Println(num)
    }
    time.Sleep(5)
}

この例では、getNumber 関数が goroutine として呼び出されますが、その戻り値は別のスタックに格納されているため、すぐには使用できません。

Goroutines では戻り値を避けますか?

戻り値の損失を避けるために、一般的に次のことをお勧めします。チャネルなどの通信メカニズムを使用して、ゴルーチンとメイン プログラム間でデータを共有します:

以上がゴルーチン内で呼び出された関数の戻り値はどうなりますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。