Menukar Slices kepada Tatasusunan Saiz Tetap dalam Go
Senario biasa dalam Go ialah keperluan untuk menukar kepingan kepada tatasusunan saiz tetap. Walaupun ini kelihatan mudah, ia boleh mengakibatkan ralat penyusunan. Untuk memahami ralat ini dan penyelesaiannya, mari analisa coretan kod berikut:
func gen(bricks []Brick) { if len(bricks) == 16 { if check(Sculpture{bricks}) { var b [16]Brick = bricks[0:16]; // This line generates the error } } }
Mesej ralat menunjukkan bahawa objek hirisan tidak boleh diperuntukkan terus kepada tatasusunan saiz tetap. Ini kerana Go menganggap kepingan dan tatasusunan sebagai jenis yang berbeza.
Penyelesaian: Menggunakan Fungsi 'salin'
Untuk menukar hirisan kepada tatasusunan saiz tetap, anda boleh gunakan fungsi 'salinan' terbina dalam. Fungsi ini mengambil dua keping sebagai input dan menyalin bilangan elemen tertentu daripada kepingan sumber ke kepingan destinasi. Dengan memberikan input yang betul, anda boleh memindahkan elemen kepingan ke dalam tatasusunan saiz tetap dengan berkesan.
Berikut ialah contoh yang menunjukkan penggunaan 'salinan':
slice := []byte("abcdefgh") var arr [4]byte copy(arr[:], slice[:4]) fmt.Println(arr) // Output: [97 98 99 100]
Dalam kes ini , 'salinan' memindahkan empat elemen pertama hirisan ke dalam tatasusunan 'arr'.
Sintaksis Alternatif
Satu lagi cara ringkas untuk mencapai hasil yang sama menggunakan 'salinan ' ialah untuk mengetepikan indeks hirisan:
copy(arr[:], slice)
Fungsi 'salin' akan menyalin bilangan elemen minimum secara automatik yang boleh ditampung oleh kedua-dua kepingan. Oleh itu, anda boleh melangkau menentukan indeks apabila saiz sepadan atau apabila anda ingin mengisi keseluruhan tatasusunan saiz tetap.
Pergi 1.17 dan Ke Atas
Perlu diperhatikan bahawa Go 1.17 memperkenalkan sokongan untuk penukaran slice-to-array. Ciri ini membolehkan anda menetapkan hirisan terus kepada penuding tatasusunan daripada jenis asas yang sama:
s := make([]byte, 2, 4) s0 := (*[0]byte)(s) // s0 != nil s1 := (*[1]byte)(s[1:]) // &s1[0] == &s[1] s2 := (*[2]byte)(s) // &s2[0] == &s[0]
Walau bagaimanapun, fungsi ini masih dianggap percubaan dan mungkin tidak tersedia dalam semua persekitaran.
Atas ialah kandungan terperinci Bagaimana untuk Menukar Slice kepada Tatasusunan Saiz Tetap dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!