ホームページ  >  記事  >  バックエンド開発  >  golangで不定のパラメータを渡す方法

golangで不定のパラメータを渡す方法

silencement
silencementオリジナル
2019-12-23 10:36:063584ブラウズ

golangで不定のパラメータを渡す方法

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

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