Heim > Backend-Entwicklung > Golang > Warum sind aufgrund der fehlenden Array-/Slice-Kovarianz in Go Problemumgehungen für den Umgang mit verschiedenen Sammlungstypen erforderlich?

Warum sind aufgrund der fehlenden Array-/Slice-Kovarianz in Go Problemumgehungen für den Umgang mit verschiedenen Sammlungstypen erforderlich?

Patricia Arquette
Freigeben: 2024-12-24 02:52:13
Original
541 Leute haben es durchsucht

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

Behebung der fehlenden Array-/Slice-Kovarianz in Go

In Go kann das Fehlen einer Array- oder Slice-Kovarianz bei der Arbeit mit zu Herausforderungen führen Sammlungen unterschiedlicher Art. 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

Das Fehlen von Generika in Go hindert uns daran, eine generische printItems-Funktion zu definieren, die Sammlungen jeglicher Art akzeptiert. Stattdessen stoßen wir auf den folgenden Fehler:

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

Schnittstellenbasierte Lösung

Ein gängiger Ansatz zur Überwindung dieser Einschränkung besteht darin, eine Schnittstelle zu verwenden, die das erforderliche Verhalten definiert für unsere Sammlung. In diesem Fall definieren wir eine List-Schnittstelle mit zwei Methoden, At (um ein Element an einem bestimmten Index abzurufen) und Len (um die Länge der Liste zu ermitteln):

type List interface {
    At(i int) interface{}
    Len() int
}
Nach dem Login kopieren

Wir erstellen dann konkrete Implementierungen dieser Schnittstelle für unsere Integer- und Float-Listen:

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

Mit diesen Implementierungen können wir jetzt unsere printItems-Funktion so ändern, dass sie eine Liste als Argument akzeptiert, sodass wir sowohl Integer- als auch Float-Listen drucken können Arrays:

import "fmt"

func printItems(header string, items List) {
    for i := 0; i < items.Len(); i++ {
        fmt.Print(items.At(i), " ")
    }
    fmt.Println()
}
Nach dem Login kopieren

In unserer Hauptfunktion können wir dann printItems mit unseren Integer- und Float-Listen aufrufen und so unser gewünschtes Ergebnis erzielen:

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

Indem wir eine Schnittstelle verwenden, um ein Common zu definieren Durch die vielen Operationen für unsere Sammlungen können wir ein gewisses Maß an Flexibilität und Wiederverwendbarkeit des Codes erreichen, obwohl es in Go keine Generika gibt.

Das obige ist der detaillierte Inhalt vonWarum sind aufgrund der fehlenden Array-/Slice-Kovarianz in Go Problemumgehungen für den Umgang mit verschiedenen Sammlungstypen erforderlich?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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