Menggunakan Antara Muka untuk Menangani Kekurangan Kovarian Tatasusunan/Slice dalam Go
Dalam Go, kekurangan kovarian tatasusunan/hirisan menimbulkan cabaran apabila bekerja dengan tatasusunan atau kepingan 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, "") }
Kod ini cuba mencetak tatasusunan integer dan tatasusunan apungan menggunakan fungsi printItems generik. Walau bagaimanapun, ia menghadapi ralat penyusunan disebabkan oleh sekatan Go pada kovarians koleksi.
Penyelesaian Menggunakan Antara Muka
Pendekatan idiomatik untuk mengatasi had ini adalah dengan menggunakan antara muka. Dengan mentakrifkan antara muka yang merangkumi saiz dan pengindeksan senarai, kami boleh mencipta jenis yang melaksanakannya untuk jenis data yang berbeza:
type List interface { At(i int) interface{} Len() int } 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) }
Penggunaan
Dengan ini jenis dan antara muka yang ditakrifkan, kini kami boleh mengakses dan mencetak secara umum tatasusunan:
func printItems(header string, items List) { for i := 0; i < items.Len(); i++ { fmt.Print(items.At(i), " ") } fmt.Println() } 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)) }
Kesimpulan
Walaupun generik menawarkan penyelesaian yang lebih elegan, menggunakan antara muka kekal sebagai pendekatan yang mantap untuk mengendalikan kovarians koleksi dalam Go, membolehkan kami bekerja dengan jenis data yang berbeza secara generik.
Atas ialah kandungan terperinci Bagaimanakah Antara Muka Boleh Menyelesaikan Masalah Kovarian Tatasusunan/Slice Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!