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は他の場所では使用できません。[]でのみ使用できます。
m:= map[string]Number
不可能であるfunc ReturnSomthing() Number { return 1}
まだ動作しません
次のように、インターフェース{}を置き換えることができます。
m:= map[string]any{
"1": 2,
"2":"GKD!",
}
复制代码
1.18はジェネリック医薬品で出てきますが、将来的にはどのような影響がありますか?現在、2022-04-17は大幅な変化は見られませんが、現時点では1つしか予測できません。goのインタビューの質問は次のように記述されます。少量。行くのはとても良いと思います。:)他の兄弟を歓迎して試してみてください、とにかく無料です。