可変個引数関数のスライスのスライスの解凍
Go では、スライスのスライスと可変個引数関数を扱うときは注意が必要ですスライスをアンパックされた引数として渡すとき。インターフェイスのスライスとは異なり、スライスのスライスは、インターフェイスのスライスを期待する可変引数関数にアンパックされた引数として直接渡すことはできません。
問題の理解
問題の根本原因問題は Go の型システムにあります。可変引数関数の最後のパラメーターは、指定された型のスライスとみなされます。ただし、スライスのスライスを渡す場合、コンパイラはスライスのスライスではなく、基本要素型のスライスを期待します。したがって、スライスのスライスを直接解凍しようとすると、型不一致エラーが発生します。
問題の解決
問題を解決するには、中間手順が必要です。基本要素タイプの新しいスライスを作成し、スライスのスライスからそれに要素をコピーします。この新しいスライスは、アンパックされた引数として可変引数関数に渡すことができます。
<code class="go">var sliceOfSlices [][]interface{} // Create a new slice to hold the unpacked elements var newSlice []interface{} for _, slice := range sliceOfSlices { newSlice = append(newSlice, slice...) } unpack(newSlice...) // Now it works</code>
動作を理解する
アンパックされたスライスを可変引数関数に渡すと、スライスの各要素は個別の引数として渡されます。これは、スライス自体を渡す場合には当てはまりません。スライスはインターフェース値でラップされ、単一の引数として渡されるためです。
これを示すために、次のコード スニペットを考えてみましょう。
<code class="go">func unpack(args ...interface{}) { fmt.Println("Number of arguments:", len(args)) } slice := []interface{}{1, 2, 3} unpack(slice) // Prints: 1 unpack(slice...) // Prints: 3</code>
出力は、スライスを直接渡すと (解凍せずに) 引数が 1 つになるのに対し、解凍すると 3 つの別個の引数が得られることを示しています。
結論
解凍可変個引数関数のスライスのスライスには、スライス要素を基本要素型の新しいスライスにコピーする中間ステップが必要です。これにより、型の不一致エラーが回避され、要素を個別の引数として関数に渡すことができます。
以上がGoで可変個引数関数のスライスのスライスを解凍する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。