Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Antara Muka Boleh Menyelesaikan Masalah Kovarian Tatasusunan/Slice Go?

Bagaimanakah Antara Muka Boleh Menyelesaikan Masalah Kovarian Tatasusunan/Slice Go?

Susan Sarandon
Susan Sarandonasal
2024-12-29 10:06:11984semak imbas

How Can Interfaces Solve Go's Array/Slice Covariance Problem?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn