Rumah >pembangunan bahagian belakang >Golang >Golang tidak boleh menggunakan pilih

Golang tidak boleh menggunakan pilih

WBOY
WBOYasal
2023-05-12 20:23:36609semak imbas

Dalam bahasa Go, pilih ialah struktur bahasa yang sangat berguna. Ia boleh menunggu untuk menerima data pada berbilang saluran Setelah salah satu saluran mempunyai data untuk diterima, operasi yang sepadan akan dilakukan dengan serta-merta. Walau bagaimanapun, terdapat beberapa kes di mana kita tidak boleh menggunakan pernyataan pilih dalam bahasa Go. Mari analisa situasi ini di bawah.

  1. Saluran itu sendiri tidak boleh menggunakan pilih

Perkara pertama yang anda perlu faham ialah apabila mengisytiharkan saluran dalam bahasa Go, anda perlu menentukan jenis saluran, dan hanya jika jenis boleh Pilih hanya boleh digunakan apabila membandingkan, menyalin dan menutup. Contohnya, saluran yang ditakrifkan di bawah:

c1 := make(chan int)
c2 := make(chan bool)

Kesemuanya boleh dipilih, kerana jenis int dan bool ialah jenis asas yang boleh dibandingkan.

Walau bagaimanapun, jika kita menentukan saluran jenis struktur, kita tidak boleh menggunakan pilih secara langsung, contohnya:

type MyStruct struct {
    x int
    y string
}

c := make(chan MyStruct)

Pilih tidak boleh digunakan kerana jenis MyStruct tidak boleh dibandingkan, jadi ia tidak boleh digunakan dalam Gunakan pilih pada saluran yang jenis salurannya ialah MyStruct.

  1. Pernyataan lalai perlu diproses

Terdapat kes khas dalam pilih, pernyataan lalai, yang akan dilaksanakan apabila semua kes tidak dapat dilaksanakan dengan segera. Jika kami menggunakan pernyataan lalai dalam pilih, pernyataan lalai juga akan dilaksanakan apabila terdapat data untuk diterima dalam apa jua keadaan.

Walau bagaimanapun, apabila menggunakan pernyataan lalai, kita mesti mempertimbangkan sebarang kemungkinan situasi dalam pilihan, termasuk yang belum dipertimbangkan. Jika kami tidak mempertimbangkan semua situasi, kami tidak boleh menggunakan lalai, jika tidak akan terdapat potensi pepijat. Contohnya, kod berikut:

select {
case msg1 := <-c1:
    fmt.Println("received", msg1)
case msg2 := <-c2:
    fmt.Println("received", msg2)
default:
    fmt.Println("nothing received") // 未考虑到其他情况的default语句
}

Dalam contoh ini, kami tidak mempertimbangkan semua situasi lain, yang mungkin menyebabkan sesetengah data diabaikan atau diproses secara salah. Oleh itu, apabila kita menggunakan pernyataan lalai, kita mesti mempertimbangkan semua situasi yang mungkin.

  1. Pilih tidak boleh digunakan semasa komunikasi segerak

Selain pernyataan lalai, terdapat juga situasi komunikasi segerak dalam bahasa Go, iaitu saluran penimbal mengisi atau Apabila ia penuh, data tidak boleh ditulis dan anda perlu menunggu goroutine lain menerima data. Pilih tidak boleh digunakan dalam kes ini.

Sebagai contoh, kod berikut:

c := make(chan int, 1)
c <- 1
c <- 2 // 缓冲区已满,此处会堵塞

Dalam contoh ini, kami mentakrifkan saluran dengan penimbal dengan saiz penimbal 1. Mula-mula tulis data 1 ke saluran, dan kemudian tulis data 2 ke saluran Pada masa ini, kerana penimbal penuh, operasi ini akan disekat. Jika kami cuba menerima data daripada saluran ini dalam pilihan, operasi ini juga akan disekat kerana penimbal penuh dan tiada operasi lain boleh dilakukan.

Oleh itu, apabila menggunakan pilih, anda mesti mengelakkan situasi kebuntuan dan memastikan bahawa operasi baca dan tulis saluran boleh dilaksanakan secara bebas.

Ringkasnya, adalah sangat penting untuk menggunakan pilih dengan betul dalam bahasa Go Kita mesti mempertimbangkan semua situasi yang mungkin untuk mengelakkan ralat pengaturcaraan dan kebuntuan. Pada masa yang sama, kita juga perlu menyedari beberapa situasi khas untuk mengelak daripada menggunakan pilihan dalam situasi yang tidak sesuai, menyebabkan pembaziran masa dan sumber.

Atas ialah kandungan terperinci Golang tidak boleh menggunakan pilih. 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