ジェネリック関数のスライスの共用体を反復処理する
Go のジェネリックスを使用すると、関数がさまざまな型で動作できるようになり、コードの再利用が可能になり、タイプセーフティ。ただし、異なる要素タイプのスライスを操作する場合、汎用関数内でスライスを反復処理するときに問題が発生する可能性があります。
整数または浮動小数点のいずれかを含む可能性があるスライスの要素を合計することを目的とした次の例を考えてみましょう。
package main import "fmt" // NumberSlice constraint type NumberSlice interface { []int64 | []float64 } func add[N NumberSlice](n N) { // want: to range over n and print value of v for _, v := range n { fmt.Println(v) } } func main() { ints := []int64{1, 2} add(ints) }
このコードを実行すると、次のエラーが発生します:
cannot range over n (variable of type N constrained by NumberSlice) (N has no core type)
問題はNumberSlice インターフェイス制約の「コア タイプ」がありません。コア型は、インターフェイスの型セット内のすべての型によって共有される単一の基礎となる型を表します。 NumberSlice は []int64 と []float64 の両方を包含するため、コア型がありません。
この問題を解決するには、いくつかのアプローチがあります。
共通の基本タイプを強制する:
基本タイプを指定し、スライス タイプを規定するようにインターフェイス制約を変更します。関数シグネチャ内:
type Number interface { int64 | float64 } func add[N Number](n []N) { for _, v := range n { fmt.Println(v) } }
明示的な型付けでジェネリックを使用する:
要素の型を指定するジェネリック スライス型を宣言し、明示的な型付けを使用して希望の要素を指定してくださいtype:
type NumberSlice[N int64 | float64] interface { ~[]N // indicates a core type of []N } func add[S NumberSlice[N], N int64 | float64](n S) { for _, v := range n { fmt.Println(v) } }
コア型を指定すると、コンパイラは適切な反復動作を推論し、ジェネリック関数内のスライスを反復するという目的の操作を可能にします。
以上がGo のジェネリック関数でスライスの結合を反復処理する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。