Heim > Backend-Entwicklung > Golang > Wie können wir die Einschränkungen der Array-/Slice-Kovarianz von Go effizient bewältigen?

Wie können wir die Einschränkungen der Array-/Slice-Kovarianz von Go effizient bewältigen?

Barbara Streisand
Freigeben: 2024-12-14 21:32:15
Original
289 Leute haben es durchsucht

How Can We Efficiently Handle Go's Array/Slice Covariance Limitations?

Adressierung der Einschränkungen der Array-/Slice-Kovarianz in Go: Ein genialer Ansatz

Gos fehlende Array-/Slice-Kovarianz kann beim Umgang mit Heterogenität zu Herausforderungen führen Sammlungen. Stellen Sie sich die folgende Situation 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

Leider schlägt dieser Code aufgrund des strengen Typisierungssystems von Go mit Kompilierungsfehlern fehl:

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

Eine ausgefeilte Lösung: Umfassende Schnittstellen

Eine elegante Möglichkeit, diese Einschränkung zu überwinden, besteht darin, das leistungsstarke Schnittstellensystem von Go zu nutzen. Durch die Definition einer Schnittstelle, die die wesentlichen Eigenschaften einer Array-ähnlichen Sammlung kapselt, können wir eine generische Lösung erstellen:

type List interface {
    At(i int) interface{}
    Len() int
}

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

Typspezifische Implementierungen

Für jede Für einen konkreten Typ implementieren wir die List-Schnittstelle:

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

Beispiel Verwendung

Um unseren generischen Code zu verwenden, verpacken wir die konkreten Arrays in unsere benutzerdefinierten Typen:

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

Dieser Ansatz ermöglicht es uns, heterogene Sammlungen auf generische Weise zu manipulieren und sie elegant zu umgehen Das Fehlen einer Array/Slice-Kovarianz bei Go bei gleichzeitiger Einhaltung seiner idiomatischen Typsicherheitsprinzipien.

Das obige ist der detaillierte Inhalt vonWie können wir die Einschränkungen der Array-/Slice-Kovarianz von Go effizient bewältigen?. 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