Apabila bekerja dengan fungsi variadik yang menerima berbilang argumen, pengendalian sekeping hirisan boleh menimbulkan cabaran. Berikut ialah contoh khusus yang membongkar sekeping kepingan boleh menyebabkan ralat pengkompil:
Pertimbangkan fungsi variadik berikut:
<code class="go">func unpack(args ...interface{})</code>
Jika kita mempunyai sekeping antara muka, kita boleh menghantarnya terus kepada fungsi tanpa sebarang isu:
<code class="go">slice := []interface{}{1, 2, 3} unpack(slice) // works unpack(slice...) // also works</code>
Walau bagaimanapun, jika kita mempunyai sekeping hirisan antara muka, percubaan untuk menghantar versi yang tidak dibungkus mengakibatkan ralat penyusunan:
<code class="go">sliceOfSlices := [][]interface{}{ []interface{}{1, 2}, []interface{}{101, 102}, } unpack(sliceOfSlices) // works unpack(sliceOfSlices...) // compiler error</code>
The mesej ralat ialah:
cannot use sliceOfSlices (type [][]interface {}) as type []interface {} in argument to unpack
Untuk memahami tingkah laku ini, kita perlu menyelidiki spesifikasi untuk menghantar argumen kepada parameter variadic dalam Go:
"Jika argumen akhir boleh diserahkan kepada jenis hirisan []T, ia mungkin dihantar tidak berubah sebagai nilai untuk parameter ...T jika hujah diikuti oleh ...."
Dalam kes ini, parameter variadic ialah ...antara muka{} dan penetapan langsung sliceOfSlices (yang jenis [][]antara muka{}) kepada args (jenis []antara muka{}) tidak sah.
Jadi, bagaimana kita boleh menghantar kandungan sliceOfSlices yang tidak dibungkus untuk membongkar()? Penyelesaiannya terletak pada mencipta kepingan baharu jenis []antara muka{}, menyalin elemen, dan kemudian menghantarnya menggunakan ....
<code class="go">var sliceOfSlices2 []interface{} for _, v := range sliceOfSlices { sliceOfSlices2 = append(sliceOfSlices2, v) } unpack(sliceOfSlices2...)</code>
Kaedah ini memastikan setiap kepingan dalam diwakili sebagai elemen dalam satu keping, menjadikannya serasi dengan ...antara muka{} parameter variadic.
Atas ialah kandungan terperinci Bagaimana untuk Membongkar Sekeping Kepingan ke dalam Fungsi Variadik dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!