インターフェイス制約のあるジェネリック関数でのスライスの共用体の処理
整数のスライスまたは整数のスライスのいずれかを操作するジェネリック関数が必要だとします。フロートのスライス。これを実装するには、次に示すようにジェネリックとインターフェイス制約を利用できます:
package main import "fmt" // NumberSlice defines an interface for either slice of integers or slice of floats. type NumberSlice interface { []int | []float64 } // add is a generic function that iterates over a slice of NumberSlice and prints its values. func add[N NumberSlice](n N) { for _, v := range n { fmt.Println(v) } } func main() { ints := []int{1, 2} add(ints) floats := []float64{3.14, 1.618} add(floats) }
ただし、上記のコードを実行しようとすると、次のエラーが発生する可能性があります:
cannot range over n (variable of type N constrained by NumberSlice) (N has no core type)
このエラーは、NumberSlice インターフェイスにコア タイプがないために発生します。インターフェイスのコア タイプは、インターフェイス内のすべてのタイプが継承する必要がある単一の基礎となるタイプです。 NumberSlice は整数のスライスと浮動小数点のスライスの両方を受け入れることができるため、この要件を満たしません。
この問題に対処するには、スライスの代わりに基本型を使用してインターフェイスを定義できます。
type Number interface { int | float64 } func add[N Number](n []N) { for _, v := range n { fmt.Println(v) } }
この変更された関数は、数値要素のスライスをパラメータとして受け取り、整数と浮動小数点の両方を効率的に処理できるようにします。
以上がGo のジェネリック関数でスライスの結合を処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。