Rumah > pembangunan bahagian belakang > Golang > Apakah yang Berlaku kepada Nilai Pulangan Fungsi yang Dipanggil dalam Goroutines?

Apakah yang Berlaku kepada Nilai Pulangan Fungsi yang Dipanggil dalam Goroutines?

Mary-Kate Olsen
Lepaskan: 2024-12-06 07:49:14
asal
824 orang telah melayarinya

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

Apakah yang Berlaku untuk Mengembalikan Nilai daripada Goroutines?

Apabila menggunakan fungsi daripada goroutine, nilai yang dikembalikan biasanya hilang kerana goroutine mempunyai persekitaran pelaksanaan terpencil sendiri. Walaupun fungsi mungkin menyimpan nilainya yang dikembalikan pada tindanan, tindanan ini berasingan daripada tindanan program utama dan dimusnahkan apabila goroutine keluar.

Analisis Nilai Pulangan Fungsi

Memeriksa output pemasangan untuk fungsi getNumber menggunakan bendera -gcflags -S mendedahkan bahawa ia menyimpan nilai yang dikembalikan pada tindanan:

"".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)
}
Salin selepas log masuk
-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

Walau bagaimanapun, nilai ini disimpan pada tindanan baharu dalam goroutine, yang kemudiannya dimusnahkan apabila goroutine ditamatkan, menjadikan nilai pulangan tidak boleh diakses daripada program utama.

Contoh

Pertimbangkan perkara berikut kod:

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)
}
Salin selepas log masuk

Dalam contoh ini, fungsi getNumber digunakan sebagai goroutine dan nilai pulangannya tidak boleh digunakan serta-merta kerana ia disimpan pada tindanan berasingan.

Sepatutnya Kami Mengelak Nilai Pulangan dalam Goroutines?

Untuk mengelakkan kehilangan nilai pulangan, biasanya disyorkan untuk menggunakan mekanisme komunikasi seperti saluran untuk berkongsi data antara goroutine dan program utama:

Atas ialah kandungan terperinci Apakah yang Berlaku kepada Nilai Pulangan Fungsi yang Dipanggil dalam Goroutines?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan