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>
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>
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>
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>
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>
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>
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!