Go で異なる型のスライスでジェネリックスを使用する
Go でのジェネリックスの考慮には、インターフェイスのコア タイプの概念が含まれます。 NumberSlice などのインターフェイス制約には、複数の基礎となる型 ([]int64 や []float64 など) が含まれるため、コアの型がありません。これは、ジェネリック関数内でスライスを反復処理しようとするときに障害となります。
この問題を解決するには、基本型を必須にするようにインターフェイスを変更し、スライス タイプが関数シグネチャ内で決定されるようにすることが 1 つの方法です。 :
type Number interface { int64 | float64 } func add[N Number](n []N) { for _, v := range n { fmt.Println(v) } }
ただし、さらに徹底した冗長な解決策には、インターフェイス内でコア タイプを明示的に宣言する必要があります。 constraint:
type NumberSlice[N int64 | float64] interface { ~[]N } func add[S NumberSlice[N], N int64 | float64](n S) { for _, v := range n { fmt.Println(v) } }
このアプローチにより、インターフェイスが特定の基礎となる型 ([]N) を持ち、関数が int64 または float64 のいずれかのスライスを受け入れて処理できることが保証されます。
以上がGo のジェネリックスは異なる数値型のスライスをどのように処理できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。