Mengendalikan Array/Slice Invariance dalam Go
Dalam Go, seseorang mungkin menghadapi cabaran bekerja dengan tatasusunan atau kepingan jenis elemen yang berbeza. Pertimbangkan contoh 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, "") }
Setelah menyusun kod ini, anda akan menghadapi ralat kerana kekurangan kovarians tatasusunan/hirisan Go. Khususnya:
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 Fleksibel
Satu pendekatan untuk mengelakkan isu ini ialah dengan mentakrifkan antara muka yang mengabstrakkan atribut biasa tatasusunan/kepingan ini:
package main import "fmt" type List interface { At(i int) interface{} Len() int } func printItems(header string, items List) { for i := 0; i < items.Len(); i++ { fmt.Print(items.At(i), " ") } fmt.Println() } 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) } 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 merangkum gelagat koleksi ini dalam antara muka, anda boleh mengakses dan memanipulasi mereka secara umum. Pendekatan ini kekal idiomatik dalam Go sambil menyediakan fleksibiliti yang diperlukan untuk mengendalikan jenis data yang berbeza.
Atas ialah kandungan terperinci Bagaimana Mengendalikan Invarian Tatasusunan/Slice Go Apabila Bekerja dengan Jenis Elemen Berbeza?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!