ジェネリック スライス引数: 区別を理解する
Go では、ジェネリック プログラミングにより、関数がさまざまな型で動作できるようにする型パラメーターが導入されます。興味深い領域の 1 つは、スライス タイプに制約されたスライス引数と一般的なスライス引数の区別です。
スライス タイプに制約されたスライス引数
slices.Grow 関数について考えてみましょう。最初の引数は ~[]E によって制約されます。これは、この引数の型が要素型 E のスライス型である必要があることを意味します。
Generic Slice Argument
対照的に、slices.Contains 関数について考えてみましょう。最初の引数は単に []E と入力します。これにより、要素タイプが E のスライス タイプが許可されます。
実際的な違い
最初は、これら 2 つのタイプのスライス引数は同様に動作するように見えるかもしれません。どちらの関数でも、追加や範囲などのスライス操作にアクセスできます。ただし、スライスを返すことに関しては、微妙ですが重要な違いがあります。
スライスを返す
関数が同じタイプのスライスを返す必要がある場合入力スライスの場合は、スライス タイプ (~[]E) に制限されたスライス引数を使用する必要があります。これにより、返されたスライスの基礎となる型が正しいことが保証されます。
例
2 つの Grow() 実装を比較してみましょう。1 つは ~[]E を使用し、もう 1 つは [ を使用します。 ]E.
<code class="go">func Grow[S ~[]E, E any](s S, n int) S { // ... } func Grow2[E any](s []E, n int) []E { // ... }</code>
カスタム型 ([]MyInt など) のスライスを渡すと、Grow() は同じ型の値を返すことができます。ただし、Grow2() は汎用スライス タイプ ([]E) のみを返すことができます。
結論
要約すると、同じスライスを返す必要がある場合は次のようになります。タイプを入力スライスとして使用する場合は、スライス タイプ (~[]E) に制限されたスライス引数を使用する必要があります。それ以外の場合は、汎用スライス引数を使用するだけで十分です。
以上がGo でスライス タイプに制約されたスライス引数と汎用スライス引数を使用する場合は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。