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
Lepaskan: 2024-12-29 10:06:11
asal
953 orang telah melayarinya

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, "")
}
Salin selepas log masuk

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) }
Salin selepas log masuk

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))
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan