実験的スライス パッケージの 2 つの関数、Contains と Grow を考えてみましょう。どちらの関数もスライス引数を受け入れますが、型制約が異なります:
Contains の最初の引数は型 []E であり、E は比較可能なものによって制約されており、E が比較可能なものである必要があることを示します。 。一方、Grow の最初の引数は、~[]E によって制約された型 S を持ち、S が E のスライスである基礎となる型を持たなければならないことを示しています。
一見したところ、これら 2 つの型制約の使用には実質的な違いがないように思えるかもしれません。ただし、Grow の引数と同じ型のスライスを返す必要がある場合はこの限りではありません。
返す必要がある場合は、入力引数と同じ型のスライスを使用する場合は、それ自体がスライスに制約される型パラメータ (例: ~[]E) を使用する必要があります。これにより、関数は引数と同じ型の値を返すことができます。
Grow の 2 つの実装を考えてみましょう。
func Grow[S ~[]E, E any](s S, n int) S // Grow returns a slice of the same type as s func Grow2[E any](s []E, n int) []E // Grow2 returns a slice of type []E
渡すとき基礎となる型としてスライスを持つカスタム型のスライスの場合、Grow は同じ型の値を返すことができますが、Grow2 は同じ型の値を返すことができません。 Grow2 は名前のないスライス型 []E の値のみを返すことができます。
type ints []int // user-defined slice type ints x := []int{1} // initialize a slice x of type []int x2 := Grow(x, 10) // x2 will be of type []int y := ints{1} // initialize a slice y of type ints y2 := Grow(y, 10) // y2 will be of type ints
ここでは、Grow2(y, 10) は int 型の値を受け取りますが、値を返します[]int 型ですが、これは意図した動作ではありません。
結論として、関数呼び出しが引数と同じ (おそらく名前付き) 型のスライスを返す必要がある場合、次を使用します。それ自体をスライスに制約する型パラメータ (~[]E) が必要です。それ以外の場合は、要素の型 (E any) のみを制約する型パラメーターを使用できます。
以上がGo のスライス引数に ~[]E と []E をいつ使用するか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。