Go の実験的パッケージ スライスでは、Contains と Grow の 2 つの関数の最初の引数に異なる型パラメータがあります。 Contain は比較可能な要素のスライス ([]E) を受け取りますが、Grow はスライス タイプ (~[]E) に制限された引数を受け取ります。
実際的な考慮事項
これらの宣言は実際には同等に見えるかもしれませんが、入力引数と同じ型のスライスを返す必要がある場合は異なります。
~[]E 型パラメータを使用する場合
引数と同じ (おそらく名前付き) 型のスライスを返す必要がある場合は、~[]E を使用します。たとえば、特定の名前付き型のスライスを拡大する汎用関数を作成する場合:
<code class="go">func Grow[S ~[]E, E any](s S, n int) S { // ... }</code>
[]E 型パラメータを使用する場合
スライスを返す必要がない場合、または名前のないスライスを返すことが許容される場合は、[]E を使用します。
<code class="go">func Contains[E comparable](s []E, v E) bool { // ... }</code>
デモ
Grow の 2 つの実装を検討します。 ():
<code class="go">// Using ~[]E func Grow[S ~[]E, E any](s S, n int) S { // ... } // Using []E func Grow2[E any](s []E, n int) []E { // ... }</code>
カスタム スライス タイプ (基礎となるタイプとしてスライスを持つ) を渡す場合、Grow() は同じタイプの値を返すことができますが、Grow2() は同じタイプの値を返すことができず、名前のないスライスを返しますtype.
出力:
x2 []int len=1 cap=12 x3 []int len=1 cap=12 y2 main.ints len=1 cap=12 y3 []int len=1 cap=12
上記のように、Grow2(y, 10) は予期しないタイプのスライスを返しますが、これは望ましくない可能性があります。
以上がGo のスライス引数に ~[]E および []E 型パラメータを使用する場合は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。