Go のジェネリック メソッド パラメーター: 型制約の問題の解決
問題:
次の Go コードを考えてみましょう。
<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>
このコードは、エラー prog.go:39: では人間 (タイプ []Human) を Count への引数のタイプ []Mammal として使用できません。この問題は、Count 関数が哺乳類の構造体の配列を予期しているのに、人間の構造体の配列を渡しているために発生します。この型制約を解決して、ID プロパティを持つ任意の型を受け入れるために Count 関数を汎用的にするにはどうすればよいでしょうか?
解決策:
1.インターフェイスの使用:
具象型を ID プロパティを定義するインターフェイスに置き換えます。例:
<code class="go">type Mammal interface { GetID() int } type Human interface { Mammal GetHairColor() string }</code>
2.埋め込みインターフェイス:
哺乳類インターフェイスとヒューマン インターフェイスの両方で ID メソッドの重複を避けるには、埋め込みインターフェイス:
<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 を使用します。 Count 関数の更新:
具体的な Mammal タイプの代わりに Mammal インターフェイスを使用するように Count 関数を変更します:
<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.インターフェイスに準拠したスライスの作成:
哺乳類インターフェイスを実装するスライスの作成:
<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.使用例:
正常にコンパイルされる使用例:
<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>
インターフェイスと組み込みインターフェイスを使用することで、Count 関数を、哺乳類インターフェイス。型制約の問題を効果的に解決します。
以上がインターフェイスを使用して Go 関数をジェネリックにする方法: 型制約の解決策の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。