So machen Sie Go-Funktionen mithilfe von Schnittstellen generisch: Eine Lösung für Typbeschränkungen

DDD
Freigeben: 2024-10-27 02:28:30
Original
353 Leute haben es durchsucht

 How to Make Go Functions Generic Using Interfaces: A  Type Constraint Solution

Generische Methodenparameter in Go: Lösung des Problems von Typbeschränkungen

Problem:

Betrachten Sie den folgenden Go-Code:

<code class="go">package main

import (
    "fmt"
    "strconv"
)

type Mammal struct {
    ID int
    Name string
}

type Human struct {
    ID int
    Name string
    HairColor string
}

func Count(ms []Mammal) *[]string {
    IDs := make([]string, len(ms))
    for i, m := range ms {
        IDs[i] = strconv.Itoa(int(m.ID))
    }
    return &IDs
}

func main() {
    ... // Code to create Mammal and Human slices
    numberOfMammalIDs := Count(mammals)
    numberOfHumanIDs := Count(humans)
    fmt.Println(numberOfMammalIDs)
    fmt.Println(numberOfHumanIDs)
}</code>
Nach dem Login kopieren

Dieser Code kann nicht mit dem Fehler kompiliert werden: prog.go:39: kann Menschen (Typ []Human) nicht als Typ []Mammal im Argument für Count verwenden.“ Das Problem entsteht, weil die Count-Funktion ein Array von Mammal-Strukturen erwartet, wir aber ein Array von Human-Strukturen übergeben. Wie können wir diese Typbeschränkung auflösen und die Count-Funktion generisch genug machen, um jeden Typ zu akzeptieren, der über eine ID-Eigenschaft verfügt?

Lösung:

1. Schnittstellen verwenden:

Ersetzen Sie die konkreten Typen durch Schnittstellen, die die ID-Eigenschaft definieren. Zum Beispiel:

<code class="go">type Mammal interface {
    GetID() int
}

type Human interface {
    Mammal
    GetHairColor() string
}</code>
Nach dem Login kopieren

2. Einbetten von Schnittstellen:

Um eine Duplizierung der ID-Methode sowohl in der Säugetier- als auch in der Mensch-Schnittstelle zu vermeiden, verwenden Sie eingebettete Schnittstellen:

<code class="go">type MammalImpl struct {
    ID int
    Name string
}

func (m MammalImpl) GetID() int {
    return m.ID
}

type HumanImpl struct {
    MammalImpl
    HairColor string
}</code>
Nach dem Login kopieren

3. Zählfunktion aktualisieren:

Ändern Sie die Zählfunktion, um die Mammal-Schnittstelle anstelle des konkreten Mammal-Typs zu verwenden:

<code class="go">func Count(ms []Mammal) *[]string {
    IDs := make([]string, len(ms))
    for i, m := range ms {
        IDs[i] = strconv.Itoa(m.GetID())
    }
    return &IDs
}</code>
Nach dem Login kopieren

4. Erstellen Sie schnittstellenkompatible Slices:

Erstellen Sie Slices, die die Mammal-Schnittstelle implementieren:

<code class="go">mammals := []Mammal{
    MammalImpl{1, "Carnivorious"},
    MammalImpl{2, "Ominivorious"},
}

humans := []Mammal{
    HumanImpl{MammalImpl: MammalImpl{ID: 1, Name: "Peter"}, HairColor: "Black"},
    HumanImpl{MammalImpl: MammalImpl{ID: 2, Name: "Paul"}, HairColor: "Red"},
}</code>
Nach dem Login kopieren

5. Beispielverwendung:

Beispielverwendung, die jetzt erfolgreich kompiliert wird:

<code class="go">package main

import (
    "fmt"
    "strconv"
)

type Mammal interface {
    GetID() int
}

type Human interface {
    Mammal
    GetHairColor() string
}

type MammalImpl struct {
    ID   int
    Name string
}

func (m MammalImpl) GetID() int {
    return m.ID
}

type HumanImpl struct {
    MammalImpl
    HairColor string
}

func (h HumanImpl) GetHairColor() string {
    return h.HairColor
}

func Count(ms []Mammal) *[]string {
    IDs := make([]string, len(ms))
    for i, m := range ms {
        IDs[i] = strconv.Itoa(m.GetID())
    }
    return &IDs
}

func main() {
    mammals := []Mammal{
        MammalImpl{1, "Carnivorious"},
        MammalImpl{2, "Ominivorous"},
    }

    humans := []Mammal{
        HumanImpl{MammalImpl: MammalImpl{ID: 1, Name: "Peter"}, HairColor: "Black"},
        HumanImpl{MammalImpl: MammalImpl{ID: 2, Name: "Paul"}, HairColor: "Red"},
    }

    numberOfMammalIDs := Count(mammals)
    numberOfHumanIDs := Count(humans)
    fmt.Println(numberOfMammalIDs) // [1 2]
    fmt.Println(numberOfHumanIDs) // [1 2]
}</code>
Nach dem Login kopieren

Durch die Verwendung von Schnittstellen und eingebetteten Schnittstellen haben wir die Count-Funktion generisch genug gemacht, um jeden Typ zu verarbeiten, der die implementiert Säugetierschnittstelle, die das Problem der Typbeschränkung effektiv löst.

Das obige ist der detaillierte Inhalt vonSo machen Sie Go-Funktionen mithilfe von Schnittstellen generisch: Eine Lösung für Typbeschränkungen. 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
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!