複数の引数を受け入れる可変個引数関数を使用する場合、スライスのスライスを処理することが困難になる可能性があります。次に、スライスのスライスを解凍するとコンパイラ エラーが発生する可能性がある具体的な例を示します。
次の可変個引数関数を考えてみましょう。
<code class="go">func unpack(args ...interface{})</code>
インターフェイスのスライスがある場合は、それを直接渡すことができます。
<code class="go">slice := []interface{}{1, 2, 3} unpack(slice) // works unpack(slice...) // also works</code>
ただし、インターフェイスのスライスのスライスがある場合、解凍されたバージョンを渡そうとするとコンパイル エラーが発生します:
<code class="go">sliceOfSlices := [][]interface{}{ []interface{}{1, 2}, []interface{}{101, 102}, } unpack(sliceOfSlices) // works unpack(sliceOfSlices...) // compiler error</code>
エラー メッセージは次のとおりです:
cannot use sliceOfSlices (type [][]interface {}) as type []interface {} in argument to unpack
この動作を理解するには、Go で引数を可変引数パラメーターに渡すための仕様を詳しく調べる必要があります:
「最後の引数が割り当て可能な場合」スライス タイプ []T に、引数の後に ....が続く場合は、変更せずに ...T パラメータの値として渡すことができます。"
この場合、可変引数パラメータは ...interface{} であり、sliceOfSlices ([][]interface{} 型) を args ([]interface{} 型) に直接割り当てることは無効です。
したがって、解凍されたsliceOfSlicesの内容をunpack()に送信するにはどうすればよいでしょうか?解決策は、[]interface{} タイプの新しいスライスを作成し、要素をコピーして、それを ....
<code class="go">var sliceOfSlices2 []interface{} for _, v := range sliceOfSlices { sliceOfSlices2 = append(sliceOfSlices2, v) } unpack(sliceOfSlices2...)</code>
を使用して渡すことです。このメソッドにより、内部の各スライスが要素として表現されるようになります。単一のスライスにまとめられているため、 ...interface{} 可変個引数パラメータと互換性があります。
以上がGoでスライスのスライスを可変引数関数に解凍する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。