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
Patricia ArquetteOriginal
2024-12-24 02:52:13482Durchsuche

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

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

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
}

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

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

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

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!

Stellungnahme:
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