Adakah Saluran Dilalui Melalui Rujukan?
Bahasa Go memperkenalkan saluran untuk konkurensi, yang seperti paip untuk komunikasi antara goroutine. Tingkah laku saluran telah menimbulkan persoalan mengenai mekanisme lulus mereka.
Pertimbangkan contoh lawatan Go untuk saluran:
package main import "fmt" func sum(a []int, c chan int) { sum := 0 for _, v := range a { sum += v } c <- sum // send sum to c } func main() { a := []int{7, 2, 8, -9, 4, 0} c := make(chan int) go sum(a[:len(a)/2], c) go sum(a[len(a)/2:], c) x, y := <-c, <-c // receive from c fmt.Println(x, y, x+y) }
Dalam contoh ini, saluran c dikongsi antara dua goroutine, setiap satu melaksanakan fungsi jumlah. Pengubahsuaian kepada saluran dalam fungsi diperhatikan dalam rutin utama. Tingkah laku ini mencadangkan saluran diluluskan melalui rujukan.
Sebab teknikal di sebalik gelagat ini terletak pada cara saluran dimulakan dan digunakan. Fungsi make memperuntukkan memori pada timbunan, mencipta penuding dengan berkesan, walaupun ia tidak terdedah kepada pengaturcara. Penunjuk ini diberikan kepada pembolehubah saluran, membenarkan ia dianggap sebagai jenis rujukan.
Spesifikasi bahasa Go mengesahkan tingkah laku ini:
"Buatan fungsi terbina dalam mengambil jenis T , yang mestilah sekeping, peta atau jenis saluran, secara pilihan diikuti dengan senarai ungkapan khusus jenis Ia mengembalikan nilai jenis T (bukan *T)."
Oleh itu, saluran dalam Go adalah secara tersirat. diluluskan dengan rujukan. Ini membolehkan komunikasi yang cekap antara gorouti dan memudahkan mekanisme penyegerakan.
Atas ialah kandungan terperinci Adakah Saluran Go Lulus dengan Rujukan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!