Golang の可変パラメータ
可変パラメータはプレースホルダです。このプレースホルダには 1 つ以上のパラメータを割り当てることができるため、実際のパラメータの数に関係なく処理できます。変数パラメータによる宣言 変数パラメータの宣言を見てみましょう:
func Printf(format string, a ...interface{}) (n int, err error) func Println(a ...interface{}) (n int, err error)
変数パラメータは名前...型を使用します 正式な宣言は関数のパラメータ リストにあり、最後のパラメータである必要がありますこれは他の言語と同様です;
変数パラメータは関数内の対応する []Type 型に変換されるため、関数を使用したときと同じように関数に渡されるパラメータを取得できます。注目すべき点の 1 つは、golang の変数パラメータはバインドされたパラメータの発生を強制する必要がないことです。
たとえば、C 言語で任意の整数を合計する関数 sum を実装したいと考えています。
int sum(int num, ...) { // todo }
最初に少なくとも 1 つの固定仮パラメータ (num) を指定した場合にのみ使用できます。 ..変数パラメータは golang で行う必要はありません:
func sum(nums ...int) int { //todo }
これは、golang の簡潔な構文の実施形態の 1 つでもあります。
パラメータを... 変数パラメータに渡す
変数パラメータを持つ関数にパラメータを渡すには 2 つの形式があります。1 つ目は通常のパラメータの渡しと何ら変わりません。sum の例を見てください。このセクションの内容は次のとおりです。
sum(1, 2, 3) sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
これは、パラメータの数が動的に変化することを除いて、通常の関数呼び出しと同じです。
2 番目の形式は、... 演算子を使用して変数... の形式でパラメーターを渡すことです。ここでの変数は、変数パラメーターと同じ型のスライスである必要があり、他の型にすることはできません。タイプ (はい、
配列も許可されていません) については、例を見てください:
numbers := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} sum(numbers...) // 和sum(1, 2, 3, 4, 5, 6, 7, 8, 9. 10)等价
このフォームで最も一般的に使用される場所は、組み込み関数 append です:
result := []int{1, 3} data := []int{5, 7, 9} result = append(result, data...) // result == []int{1, 3, 5, 7, 9}
それは Python に関連していますか? アンパック操作は非常に似ています、はい、ほとんどの場合... 演算子を golang のアンパック操作として扱うことができますが、注意すべき違いがいくつかあります:
まず、スライス タイプには... 演算子のみを使用できます:
arr := [...]int{1, 2, 3, 4, 5} sum(arr...) // 编译无法通过
次のようなエラー メッセージが表示されます:
cannot use arr (type [5]int) as type []int in argument to sum
これは、変数パラメータが実際にはスライス,... 演算子は糖衣構文です。前のスライスを独立した n パラメータに解凍して
渡すのではなく、変数パラメータに直接コピーします。これが、私が唯一の理由です。言う... .operator が unpack のように見える理由。 2 番目に注意すべきことは、独立したパラメーターの受け渡しと... 演算子を混在させることはできないということです。別の例を見てみましょう:slice := []int{2, 3, 4, 5} sum(1, slice...) // 无法通过编译
too many arguments in call to sum have (number, []int...) want (...int)
これは、前に説明したのと同じ理由です。... 演算子は、変数パラメータを直接スライスに置き換えます。これにより、以前に独立して指定されたパラメータは、変数パラメータとしてカウントされなくなります。スコープ内
では、関数のパラメーター リストが (...int) から (int, ...int) に変更され、最終的に関数の型の不一致とコンパイルの失敗が発生します。
正しいアプローチも非常に簡単です。パラメーターを変数パラメーターに渡すために... 演算子を混合して使用しないでください。
この記事を読んで簡単な接続をすれば、golang の変数パラメータの使い方をマスターできると思います。
以上がgolangで不定のパラメータを渡す方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。