可変個引数関数での「展開された」スライスと通常のパラメーターの組み合わせ
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 サイトの他の関連記事を参照してください。