一般的なスライス引数とスライス タイプの制約
Go の実験的なスライス パッケージでは、Contains と Grow の 2 つの関数が異なる型の引数を取ります。制約。 Contains は汎用の []E 型を受け取りますが、Grow はその引数の型をスライス (~[]E) に制約します。
型制約
型制約、 ~ で示され、型が特定のインターフェイスまたは一連のルールに準拠していることを保証します。 Grow では、~[]E 制約により、引数の型は最終的に要素型 E のスライスでなければならないことが強制されます。
同等の機能?
異なる型制約にもかかわらず、両方の関数内で使用できる操作はほぼ同じように見えます。ただし、実質的な重要な違いは、関数が入力引数と同じ型のスライスを返さなければならない場合に現れます。
スライスを返す
同じ型のスライスを返す場合入力として、~[]E のような型制約を使用することが重要です。これにより、関数が入力スライスの名前付きタイプを保持できるようになります。
Grow() の 2 つのバージョンを考えてみましょう:
// Preserves named type func Grow[S ~[]E, E any](s S, n int) S {...} // Returns unnamed type func Grow2[E any](s []E, n int) []E {...}
Grow() がカスタム スライス タイプを受け取った場合、戻り値を返すことができます。同じタイプのスライスですが、Grow2() は常に名前のないスライスを返します。
デモ
type MyInts []int x := MyInts{1} // Custom slice type x2 := Grow(x, 10) // Type preserved x3 := Grow2(x, 10) // Unnamed type
この例では、x2 は次のスライスになります。型は MyInts ですが、x3 は名前のないスライスになります。
結論
戻り値で入力スライスの名前付き型を保持する必要がある場合、それが必要です。 ~[]E のような型制約を使用します。それ以外の場合、返されるスライスは常に名前のない型になります。
以上が関数からスライスを返す場合、スライス制約は型の保持にどのような影響を与えますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。