実験的スライス パッケージの 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) は ints 型の値を受け取りますが、[]int 型の値を返します。
結論として、関数呼び出しで、それ自体がスライスに制約される型パラメータを使用して、引数と同じ (おそらく名前付き) 型のスライスを返す必要がある場合(~[]E)は必須です。それ以外の場合は、要素の型 (E any) のみを制約する型パラメーターを使用できます。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3