Pertimbangkan coretan kod berikut, yang menggunakan saluran jenis struct{} untuk memudahkan komunikasi antara gorouti:
package main import "fmt" var battle = make(chan string) func warrior(name string, done chan struct{}) { select { case opponent := <-battle: fmt.Printf("%s beat %s\n", name, opponent) case battle <- name: // I lost :-( } done <- struct{}{} } func main() { done := make(chan struct{}) langs := []string{"Go", "C", "C++", "Java", "Perl", "Python"} for _, l := range langs { go warrior(l, done) } for _ = range langs { <-done } }
[Soalan 1]
Barisan selesai <- struct{}{}, yang menghantar struct kosong ke saluran selesai, telah mencetuskan kekeliruan. Walaupun struct biasa boleh diisytiharkan dengan struct { /* medan */ }, struct kosong dilambangkan dengan struct{}{}, yang menggesa beberapa soalan:
An struktur kosong ialah struct yang tidak mempunyai sebarang medan. Ia juga dikenali sebagai struktur tanpa nama. Tujuan struct kosong adalah untuk menyediakan cara untuk mencipta jenis yang tidak mempunyai medan, yang boleh berguna untuk pelbagai sebab, seperti:
Dalam kod kami, kami menggunakan struct tanpa nama untuk menandakan bahawa goroutine telah menyelesaikan kerjanya. Menggunakan struct kosong untuk tujuan ini adalah berfaedah kerana ia mempunyai saiz 0, meminimumkan jejak memori.
[Soalan 2]
Garis untuk _ = range langs { <-done } bertanggungjawab untuk menerima dan membuang nilai daripada saluran selesai. Baris ini diperlukan atas sebab-sebab berikut:
Dengan menggunakan saluran jenis struct{} dan struct kosong sebagai mekanisme isyarat, kita boleh mencapai komunikasi yang cekap antara gorouti dengan overhed minimum .
Atas ialah kandungan terperinci Structs Tanpa Nama lwn. Structs Kosong dalam Go: Mengapa Menggunakan `struct{}` untuk Penyegerakan Goroutine?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!