Apabila ia datang untuk menghantar data melalui saluran ke goroutine untuk pemprosesan selanjutnya, keinginan untuk saluran yang boleh mengendalikan sebarang jenis sering timbul. Dengan pengenalan generik dalam Go 1.18, cabaran sebegitu kelihatan boleh diurus. Walau bagaimanapun, terdapat satu tangkapan: menyatakan jenis saluran kepada goroutine semasa pemulaan kekal sebagai penghalang kerana ia boleh menyimpan sebarang jenis data.
Dalam usaha menangani isu ini, pertimbangkan kod sampel berikut:
type Message[T any] struct { Data T } type Packet[T any] struct { Msg Message[T] } func StartController[T any](sender chan Packet[T]) { go runThread(sender) } func runThread[T any](sender chan Packet[T]) { for true { data := <-sender fmt.Println(data) } }
Dalam kod ini, fungsi StartController memulakan goroutine yang melaksanakan fungsi runThread. Walau bagaimanapun, terdapat ralat penyusunan disebabkan oleh percubaan untuk menggunakan jenis generik Packet[antara muka T{}] tanpa instantiasi.
Salah tanggapan biasa terletak pada penggunaan generik untuk mencipta saluran yang boleh menampung sebarang jenis. Sama seperti Java's List Sebagai contoh, pertimbangkan pengumpul generik Java ArrayList Dalam kes ini, saluran boleh menerima sebarang jenis data. Walau bagaimanapun, persoalan timbul: bagaimanakah pengendalian saluran generik harus menerima operasi? Jika apa-apa boleh dihantar ke dalamnya, apakah jenis data item yang diterima? Oleh itu, penyelesaian yang paling sesuai kekal antara muka chan{} dengan penegasan jenis apabila menerima item, seperti yang dilakukan dalam kod tanpa generik. Sebaliknya, nilai sebenar generik terletak pada penulisan kod yang mengendalikan jenis sewenang-wenangnya sambil mengekalkan keselamatan jenis. Contohnya: Fungsi ini boleh dipanggil sama ada dengan chan int atau rentetan chan. Atas ialah kandungan terperinci Bagaimanakah Go Generics Boleh Digunakan untuk Mencipta Saluran Jenis-Selamat Mengendalikan Jenis Masa Jalan yang Berbeza?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!c := make(chan interface{})
func receiveAny[T any](c chan T) T {
return <-c
}