「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Go のスライス引数に ~[]E と []E をいつ使用するか?

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

2024 年 11 月 4 日に公開
ブラウズ:634

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.

Example

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) は ints 型の値を受け取りますが、[]int 型の値を返します。

結論

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

リリースステートメント この記事は次の場所に転載されています: 1729668019 権利侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3