ホームページ >バックエンド開発 >Golang >インターフェイスを使用して Go 関数をジェネリックにする方法: 型制約の解決策

インターフェイスを使用して Go 関数をジェネリックにする方法: 型制約の解決策

DDD
DDDオリジナル
2024-10-27 02:28:30420ブラウズ

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

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。