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
Patricia Arquetteasal
2024-12-24 02:52:13477semak imbas

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, "")
}

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

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
}

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) }

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()
}

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))
}

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!

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