Rumah >pembangunan bahagian belakang >Golang >Mengapakah Saya Masih Boleh Menerima Nilai daripada Saluran Go Tertutup?

Mengapakah Saya Masih Boleh Menerima Nilai daripada Saluran Go Tertutup?

DDD
DDDasal
2024-12-09 17:42:12417semak imbas

Why Can I Still Receive Values from a Closed Go Channel?

Mengapa Menerima Nilai daripada Saluran Tertutup Adalah Mungkin

Dalam Go, saluran menyediakan mekanisme komunikasi antara goroutine. Apabila saluran ditutup, ia menunjukkan bahawa tiada lagi nilai akan dihantar. Walau bagaimanapun, ini tidak bermakna bahawa nilai sedia ada dalam penimbal saluran akan dibuang serta-merta.

Spesifikasi menyatakan bahawa selepas menutup saluran, sebarang nilai yang dihantar sebelum ini masih boleh diterima sebelum menerima nilai sifar. Ini kerana penimbal saluran bertindak sebagai baris gilir, menyimpan nilai yang dihantar sebelum operasi tutup.

Cara Ia Berfungsi:

Pertimbangkan kod berikut:

package main

import "fmt"
import "sync"
import "time"

func main() {
    iCh := make(chan int, 99)
    var wg sync.WaitGroup
    go func() {
        for i := 0; i < 5; i++ {
            wg.Add(1)
            go func(i int) {
                defer wg.Done()
                iCh <- i
            }(i)
        }
        wg.Wait()
        close(iCh)
    }()
    time.Sleep(5 * time.Second)
    for i := range iCh {
        fmt.Printf("%v\n", i)
    }
}

Output:

0
1
2
3
4

Walaupun saluran ditutup selepas 5 saat, gelung for masih menerima 5 nilai yang dihantar sebelum operasi tutup. Ini kerana penimbal saluran menyimpan nilai ini sehingga ia digunakan.

Hanya selepas menerima semua nilai yang dihantar sebelum ini, gelung for akan mengembalikan nilai sifar, menunjukkan bahawa saluran ditutup.

Mengapa Helah "Time.Sleep" Gagal:

Helah "time.Sleep" berkesan tidak menghalang goroutine daripada terus menghantar nilai ke saluran sebelum ia ditutup. Semasa goroutine sedang tidur selama 5 saat, mereka mungkin menghantar nilai tambahan yang masih akan ditimbal dan diterima oleh gelung untuk.

Atas ialah kandungan terperinci Mengapakah Saya Masih Boleh Menerima Nilai daripada Saluran Go Tertutup?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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