Go のスライス引数に ~[]E と []E をいつ使用するか?

DDD
リリース: 2024-10-24 04:23:02
オリジナル
688 人が閲覧しました

When to Use ~[]E vs []E for Slice Arguments in Go?

一般的なスライス引数の微妙な点を調べる

実験的スライス パッケージの 2 つの関数、Contains と Grow を考えてみましょう。どちらの関数もスライス引数を受け入れますが、型制約が異なります:

型制約

Contains の最初の引数は型 []E であり、E は比較可能なものによって制約されており、E が比較可能なものである必要があることを示します。 。一方、Grow の最初の引数は、~[]E によって制約された型 S を持ち、S が E のスライスである基礎となる型を持たなければならないことを示しています。

実際的な意味

一見したところ、これら 2 つの型制約の使用には実質的な違いがないように思えるかもしれません。ただし、Grow の引数と同じ型のスライスを返す必要がある場合はこの限りではありません。

スライス制約型パラメータの重要性

返す必要がある場合は、入力引数と同じ型のスライスを使用する場合は、それ自体がスライスに制約される型パラメータ (例: ~[]E) を使用する必要があります。これにより、関数は引数と同じ型の値を返すことができます。

Grow のデモ

Grow の 2 つの実装を考えてみましょう。

func Grow[S ~[]E, E any](s S, n int) S // Grow returns a slice of the same type as s
func Grow2[E any](s []E, n int) []E // Grow2 returns a slice of type []E
ログイン後にコピー

渡すとき基礎となる型としてスライスを持つカスタム型のスライスの場合、Grow は同じ型の値を返すことができますが、Grow2 は同じ型の値を返すことができません。 Grow2 は名前のないスライス型 []E の値のみを返すことができます。

type ints []int // user-defined slice type ints
x := []int{1} // initialize a slice x of type []int
x2 := Grow(x, 10) // x2 will be of type []int
y := ints{1} // initialize a slice y of type ints
y2 := Grow(y, 10) // y2 will be of type ints
ログイン後にコピー

ここでは、Grow2(y, 10) は int 型の値を受け取りますが、値を返します[]int 型ですが、これは意図した動作ではありません。

結論

結論として、関数呼び出しが引数と同じ (おそらく名前付き) 型のスライスを返す必要がある場合、次を使用します。それ自体をスライスに制約する型パラメータ (~[]E) が必要です。それ以外の場合は、要素の型 (E any) のみを制約する型パラメーターを使用できます。

以上がGo のスライス引数に ~[]E と []E をいつ使用するか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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