ホームページ >バックエンド開発 >Golang >Go の可変個引数関数で、展開されたスライスと通常のパラメーターを組み合わせることができますか?

Go の可変個引数関数で、展開されたスライスと通常のパラメーターを組み合わせることができますか?

DDD
DDDオリジナル
2024-12-11 05:40:14806ブラウズ

Can Exploded Slices and Regular Parameters Be Combined in Go's Variadic Functions?

可変個引数関数での「展開された」スライスと通常のパラメーターの組み合わせ

Go 言語では、変数を受け入れる可変個引数関数を使用できます。引数の数。ただし、このような関数で「展開された」スライス (個別の要素として渡されるスライス) を通常のパラメーターと組み合わせようとする場合、特定の制限があります。

次の例を考えてみましょう。

func main() {
    stuff := []string{"baz", "bla"}
    foo("bar", stuff...)
}

func foo(s ...string) {
    fmt.Println(s)
}

この例では、コードでは、スタッフ スライスの要素を個別に foo 関数に渡すことが想定されています。ただし、コンパイラは「引数が多すぎる」ためにエラーを発生させます。このエラーは、Go では展開されたスライスと通常のパラメーターの混合が許可されていないために発生します。

この制限の理由は、Go での可変長引数の受け渡し方法にあります。分解されたスライスが使用される場合、分解されたスライスの要素を使用して新しいスライスが作成されます。ただし、通常のスライスが ... を使用して渡された場合、新しいスライスは作成されません。代わりに、既存のスライスへの参照が渡されます。

上の例では、展開されたスライスと通常のパラメーター (「bar」) の両方を使用して、可変個引数パラメーターの値を指定しようとしています。 。このメソッドの混合は、Go 言語仕様では許可されていません。

この問題を解決するには、スライスを分解するか、通常のパラメータとして使用するかを選択する必要があります。例:

// Explode the slice before passing to the variadic function
foo("bar", stuff[0], stuff[1])

// Pass the slice as a single argument
foo(append([]string{"bar"}, stuff...))

Go の可変個引数の制限を理解することで、開発者は異なるタイプのパラメーターを混合する際の潜在的なエラーを回避できます。

以上がGo の可変個引数関数で、展開されたスライスと通常のパラメーターを組み合わせることができますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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