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

Patricia Arquette
リリース: 2024-10-24 01:47:01
オリジナル
860 人が閲覧しました

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

ソース:php
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!