Bagaimana untuk Membongkar Sekeping Kepingan ke dalam Fungsi Variadik dalam Go?

Patricia Arquette
Lepaskan: 2024-10-28 12:14:31
asal
575 orang telah melayarinya

How to Unpack a Slice of Slices into a Variadic Function in Go?

Fungsi Variadik dan Potongan Kepingan yang Dibongkar

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

The mesej ralat ialah:

cannot use sliceOfSlices (type [][]interface {}) as type []interface {} in argument to unpack
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan