ホームページ >バックエンド開発 >Golang >Go のスライス引数に ~[]E および []E 型パラメータを使用する場合は?

Go のスライス引数に ~[]E および []E 型パラメータを使用する場合は?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-24 01:47:01971ブラウズ

When to Use ~[]E and []E Type Parameters for Slice Arguments in Go?

一般的なスライス引数の違い

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。