Heim > Backend-Entwicklung > Golang > Wie können Schnittstellen das Array/Slice-Kovarianzproblem von Go lösen?

Wie können Schnittstellen das Array/Slice-Kovarianzproblem von Go lösen?

Susan Sarandon
Freigeben: 2024-12-29 10:06:11
Original
953 Leute haben es durchsucht

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

Verwendung von Schnittstellen zur Behebung von Array-/Slice-Kovarianzdefiziten in Go

In Go stellt der Mangel an Array-/Slice-Kovarianz Herausforderungen bei der Arbeit mit dar Arrays oder Slices verschiedener Typen. Stellen Sie sich das folgende Szenario vor:

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, "")
}
Nach dem Login kopieren

Dieser Code versucht, ein Integer-Array und ein Float-Array mithilfe einer generischen printItems-Funktion zu drucken. Es kommt jedoch zu Kompilierungsfehlern aufgrund der Go-Beschränkung der Sammlungskovarianz.

Lösung mit Schnittstellen

Ein idiomatischer Ansatz zur Überwindung dieser Einschränkung ist die Verwendung von Schnittstellen. Indem wir eine Schnittstelle definieren, die die Größe und Indizierung einer Liste kapselt, können wir Typen erstellen, die sie für verschiedene Datentypen implementieren:

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) }
Nach dem Login kopieren

Verwendung

Mit diesen Typen und die definierte Schnittstelle können wir nun generisch auf die zugreifen und sie ausdrucken Arrays:

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))
}
Nach dem Login kopieren

Fazit

Während Generika eine elegantere Lösung bieten, bleibt die Verwendung von Schnittstellen ein robuster Ansatz zum Umgang mit Sammlungskovarianz in Go, der es uns ermöglicht, damit zu arbeiten verschiedene Datentypen auf generische Weise.

Das obige ist der detaillierte Inhalt vonWie können Schnittstellen das Array/Slice-Kovarianzproblem von Go lösen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage