Bagaimana untuk Menukar Slice kepada Tatasusunan Saiz Tetap dalam Go?

Susan Sarandon
Lepaskan: 2024-11-11 18:35:03
asal
907 orang telah melayarinya

How to Convert a Slice to a Fixed Size Array in Go?

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

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

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

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

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!

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