Rumah > pembangunan bahagian belakang > Golang > Adakah gelagat saluran go berubah bergantung pada cara mesej dihantar kepadanya?

Adakah gelagat saluran go berubah bergantung pada cara mesej dihantar kepadanya?

WBOY
Lepaskan: 2024-02-09 10:39:20
ke hadapan
808 orang telah melayarinya

go 通道的行为是否会根据消息发送到它的方式而改变?

editor php Xiaoxin Dalam bahasa Go, saluran ialah mekanisme yang digunakan untuk memindahkan data antara goroutine. Gelagat saluran bergantung pada cara mesej dihantar kepadanya. Apabila saluran diisytiharkan sebagai penimbal, goroutine yang menghantar mesej akan meletakkan mesej ke dalam penimbal saluran dan kemudian meneruskan pelaksanaan. Apabila saluran diisytiharkan tidak buffer, goroutine yang menghantar mesej akan disekat sehingga goroutine lain menerima mesej daripada saluran. Oleh itu, boleh dikatakan bahawa tingkah laku saluran berubah bergantung pada cara mesej dihantar kepadanya.

Kandungan soalan

Mengapa kedua-dua keping kod ini dilaksanakan secara berbeza?

  1. Menjalankan kod berikut akan mengembalikan fatal 错误:所有 goroutine 都在休眠 - 死锁!ralat.
func main() {
    ch := make(chan int)
    ch <- 1
    fmt.println(<-ch)
}
Salin selepas log masuk
  • Menjalankan kod berikut dengan betul akan mengembalikan 2 dan 3 (satu baris setiap satu).
  • ch := make(chan int)
        go buffer(ch)
        fmt.Println(<-ch)
        fmt.Println(<-ch)
    }
    
    func buffer(ch chan int) {
        ch <- 2
        ch <- 3
    }
    Salin selepas log masuk

    #1 hanya berfungsi dengan betul jika ch ditakrifkan sebagai saluran penimbal. kenapa? Mengapa buffer() dalam ch menerima 2 nilai tanpa mengeluh?

    Penyelesaian

    Hantar operasi pada saluran yang tidak buffer akan disekat sehingga goroutine lain membaca data daripadanya. Inilah sebabnya mengapa sekeping kod pertama menemui jalan buntu: apabila anda menghantar ke saluran, tiada goroutine lain membaca daripadanya.

    Dalam kes kedua, anda mempunyai goroutine menghantar dua nilai ke saluran, dan goroutine utama membaca dari saluran dua kali semasa menghantar. Saluran tidak menerima dua hantaran, tetapi satu demi satu, dengan operasi penghantaran pertama dinyahsekat oleh bacaan pertama dan operasi penghantaran kedua dinyahsekat oleh bacaan kedua.

    Atas ialah kandungan terperinci Adakah gelagat saluran go berubah bergantung pada cara mesej dihantar kepadanya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

    Label berkaitan:
    sumber:stackoverflow.com
    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
    Tutorial Popular
    Lagi>
    Muat turun terkini
    Lagi>
    kesan web
    Kod sumber laman web
    Bahan laman web
    Templat hujung hadapan