Heim > Backend-Entwicklung > Golang > Wie können Schnittstellen die Array-/Slice-Kovarianzbeschränkungen von Go lösen?

Wie können Schnittstellen die Array-/Slice-Kovarianzbeschränkungen von Go lösen?

DDD
Freigeben: 2024-12-25 02:18:10
Original
460 Leute haben es durchsucht

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

Nutzung von Schnittstellen zur Überwindung von Array-/Slice-Kovarianzbeschränkungen in Go

Der inhärente Mangel an Generika in der Programmiersprache Go kann beim Arbeiten zu Herausforderungen führen mit Datensammlungen unterschiedlicher Art. Ein besonderes Dilemma entsteht, wenn versucht wird, Arrays oder Slices verschiedener Elementtypen an Funktionen zu übergeben, die einen generischen Sammlungstyp erwarten, wie etwa []interface{}.

Bedenken Sie den folgenden Codeausschnitt:

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

In diesem Szenario schlägt die Kompilierung des Codes fehl, da Go die Übergabe von Sammlungen mit inkompatiblen Elementtypen an Funktionen als Argumente verbietet. Um diese Einschränkung zu umgehen, kann ein alternativer Ansatz verwendet werden, der auf Schnittstellen basiert.

Lösung: Schnittstellen berücksichtigen

Schnittstellen in Go bieten eine Möglichkeit, eine Reihe von Methoden zu definieren, die Ein Typ muss implementiert werden. Durch die Erstellung einer Schnittstelle, die die wesentlichen Vorgänge für den Zugriff auf und die Verwaltung einer Sammlung kapselt, wird es möglich, auf generische Weise mit Sammlungen unterschiedlicher Typen zu arbeiten.

Im folgenden modifizierten Codeausschnitt wird eine List-Schnittstelle definiert:

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

Diese Schnittstelle gibt zwei Methoden an: At zum Indizieren der Sammlung und Len zum Abrufen ihrer Länge. Anschließend werden separate Typen für Integer- und Float-Listen definiert und jeder implementiert 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

Schließlich kann die printItems-Funktion aktualisiert werden, um einen List-Parameter zu akzeptieren:

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

Dieser Ansatz nutzt Schnittstellen, um den zugrunde liegenden Sammlungstyp zu abstrahieren, was in diesem Beispiel eine generische Verarbeitung von Ganzzahl- und Gleitkomma-Arrays ermöglicht. Durch die Definition der notwendigen Methoden für den Zugriff auf und die Verwaltung der Sammlung wird es möglich, auf einheitliche Weise mit ihnen zu interagieren.

Während Generika solche Szenarien in Go tatsächlich vereinfachen würden, dient die Nutzung von Schnittstellen als praktikable Alternativlösung , wodurch Programmierer effektiv mit Sammlungen verschiedener Typen arbeiten können.

Das obige ist der detaillierte Inhalt vonWie können Schnittstellen die Array-/Slice-Kovarianzbeschränkungen 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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage