ジェネリック スライス引数: 区別を理解する
Go では、ジェネリック プログラミングでは、関数がさまざまな型で動作できるようにする型パラメータが導入されています。興味深い領域の 1 つは、スライス タイプに制約されたスライス引数と一般的なスライス引数の区別です。
スライス タイプに制約されたスライス引数
slices.Grow 関数について考えてみましょう。最初の引数は ~[]E によって制約されます。これは、この引数の型が要素型 E のスライス型である必要があることを意味します。
Generic Slice Argument
対照的に、slices.Contains 関数について考えてみましょう。最初の引数は単に []E と入力します。これにより、要素タイプが E のスライス タイプが許可されます。
実際的な違い
最初は、これら 2 種類のスライス引数は同様に動作するように見えるかもしれません。どちらの関数でも、追加や範囲などのスライス操作にアクセスできます。ただし、スライスを返すことに関しては、微妙ですが重要な違いがあります。
スライスを返す
関数が同じタイプのスライスを返す必要がある場合入力スライスの場合は、スライス タイプ (~[]E) に制限されたスライス引数を使用する必要があります。これにより、返されたスライスの基礎となる型が正しいことが保証されます。
例
2 つの Grow() 実装を比較してみましょう。1 つは ~[]E を使用し、もう 1 つは [ を使用します。 ]E.
func Grow[S ~[]E, E any](s S, n int) S {
// ...
}
func Grow2[E any](s []E, n int) []E {
// ...
}
カスタム型 ([]MyInt など) のスライスを渡すと、Grow() は同じ型の値を返すことができます。ただし、Grow2() は汎用スライス タイプ ([]E) のみを返すことができます。
結論
まとめると、同じスライスを返す必要がある場合は、タイプを入力スライスとして使用する場合は、スライス タイプ (~[]E) に制限されたスライス引数を使用する必要があります。それ以外の場合は、汎用スライス引数を使用するだけで十分です。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3