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
DDDOriginal
2024-12-25 02:18:10452Durchsuche

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

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
}

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

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

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!

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