ジェネリックスの簡潔なチュートリアルに進む

1.18以降のジェネリックを使用してください

この記事のコードは、チュートリアル:ジェネリックス入門からのものです。それでも比較的単純です。この記事(私自身が作成)は引き続き更新されます。

最初の例を参照してください

// 累加int
func SumInts(m map[string]int64) int64 {
    var s int64
    for _, v := range m {
        s += v
    }
    return s
}

// 累加float
func SumFloats(m map[string]float64) float64 {
    var s float64
    for _, v := range m {
        s += v
    }
    return s
}
复制代码

呼び出されたときは次のようになります。

func main() {
    // 初始化int map 
    ints := map[string]int64{
        "first":  34,
        "second": 12,
    }

    // 初始化float map
    floats := map[string]float64{
        "first":  35.98,
        "second": 26.99,
    }

    fmt.Printf("Non-Generic Sums: %v and %v\n",
        SumInts(ints),
        SumFloats(floats))
}
复制代码

これらの2つの機能は明らかにツーインワンです。したがって、1.18で型宣言を追加してください

func[在这里写啦!]()
复制代码

上記のように、次のように完了することができます。

func SumIntsOrFloats[K comparable, V int64 | float64](m map[K]V) V
复制代码

Comparableはアダプティブタイプです。|を追加すると、2つのタイプになり得ることを示すことができます。それはどうですか?tsのような味ですか?

より具体的な実装は次のとおりです。

func SumIntsOrFloats[K comparable, V int64 | float64](m map[K]V) V {
    var s V
    for _, v := range m {
        s += v
    }
    return s
}
复制代码

もう1つの不可解なことは、同等のものをいつ使用するかです。

比較演算子のオペランドとして値を使用できるすべての型を許可==!=ます。Goでは、マップキーが比較可能である必要があります。==および!=で表される値を許可します。Goでは、マップキーが同等である必要があります

複数の場所で使用する必要がある場合は、

type Number interface {
    int64 | float64
}
复制代码

どこにでも共用体型を書くことを保存します。

func SumNumbers[K comparable, V Number](m map[K]V) V {
    var s V
    for _, v := range m {
        s += v
    }
    return s
}
复制代码

しかし!Typeは他の場所では使用できません。[]でのみ使用できます。

  1. m:= map[string]Number不可能である
  2. func ReturnSomthing() Number { return 1}まだ動作しません

次のように、インターフェース{}を置き換えることができます。

m:= map[string]any{
        "1": 2,
        "2":"GKD!",
    }
复制代码

1.18はジェネリック医薬品で出てきますが、将来的にはどのような影響がありますか?現在、2022-04-17は大幅な変化は見られませんが、現時点では1つしか予測できません。goのインタビューの質問は次のように記述されます。少量。行くのはとても良いと思います。:)他の兄弟を歓迎して試してみてください、とにかく無料です。

おすすめ

転載: juejin.im/post/7087528794873380894