Mengatasi Kekurangan Array/Slice Covariance dalam Go
Dalam Go, ketiadaan array atau slice kovarians boleh menimbulkan cabaran apabila bekerja dengan koleksi pelbagai jenis. Pertimbangkan senario berikut:
func printItems(header string, items []interface{}, fmtString string) { // ... } func main() { var iarr = []int{1, 2, 3} var farr = []float{1.0, 2.0, 3.0} printItems("Integer array:", iarr, "") printItems("Float array:", farr, "") }
Kekurangan generik Go menghalang kami daripada mentakrifkan fungsi printItems generik yang menerima koleksi apa-apa jenis. Sebaliknya, kami menghadapi ralat berikut:
prog.go:26: cannot use iarr (type []int) as type []interface { } in function argument prog.go:27: cannot use farr (type []float) as type []interface { } in function argument
Penyelesaian Berasaskan Antara Muka
Satu pendekatan biasa untuk mengatasi had ini ialah menggunakan antara muka yang mentakrifkan tingkah laku yang diperlukan untuk koleksi kami. Dalam kes ini, kami mentakrifkan antara muka Senarai dengan dua kaedah, At (untuk mendapatkan semula item pada indeks tertentu) dan Len (untuk mendapatkan panjang senarai):
type List interface { At(i int) interface{} Len() int }
Kami kemudian mencipta pelaksanaan konkrit antara muka ini untuk senarai integer dan apungan kami:
type IntList []int type FloatList []float64 func (il IntList) At(i int) interface{} { return il[i] } func (fl FloatList) At(i int) interface{} { return fl[i] } func (il IntList) Len() int { return len(il) } func (fl FloatList) Len() int { return len(fl) }
Dengan pelaksanaan ini, kami kini boleh mengubah suai fungsi printItems kami untuk menerima Senarai sebagai hujah, membolehkan kami mencetak kedua-dua tatasusunan integer dan terapung:
import "fmt" func printItems(header string, items List) { for i := 0; i < items.Len(); i++ { fmt.Print(items.At(i), " ") } fmt.Println() }
Dalam fungsi utama kami, kami kemudiannya boleh memanggil printItems dengan senarai integer dan apungan kami, mencapai hasil yang kami inginkan:
func main() { var iarr = []int{1, 2, 3} var farr = []float64{1.0, 2.0, 3.0} printItems("Integer array:", IntList(iarr)) printItems("Float array:", FloatList(farr)) }
Dengan menggunakan antara muka untuk menentukan set operasi biasa untuk koleksi kami, kami boleh mencapai tahap fleksibiliti dan kebolehgunaan semula kod, walaupun tiada daripada generik dalam Go.
Atas ialah kandungan terperinci Mengapa Kekurangan Kovarian Tatasusunan/Slice Go Memerlukan Penyelesaian untuk Mengendalikan Jenis Koleksi Berbeza?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!