Rumah > pembangunan bahagian belakang > Golang > Mengapa Kekurangan Kovarian Tatasusunan/Slice Go Memerlukan Penyelesaian untuk Mengendalikan Jenis Koleksi Berbeza?

Mengapa Kekurangan Kovarian Tatasusunan/Slice Go Memerlukan Penyelesaian untuk Mengendalikan Jenis Koleksi Berbeza?

Patricia Arquette
Lepaskan: 2024-12-24 02:52:13
asal
470 orang telah melayarinya

Why Does Go's Lack of Array/Slice Covariance Require Workarounds for Handling Different Collection Types?

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

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

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

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

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

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

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!

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