Menambahkan Kepingan dan Tatasusunan Byte dalam Go: Penyelesaian Masalah dan Penyelesaian
Dalam Go, menambahkan hirisan tatasusunan dua bait boleh membawa kepada ralat yang tidak dijangka. Pertimbangkan kod berikut:
one := make([]byte, 2) two := make([]byte, 2) one[0] = 0x00 one[1] = 0x01 two[0] = 0x02 two[1] = 0x03 log.Printf("%X", append(one[:], two[:])) three := []byte{0, 1} four := []byte{2, 3} five := append(three, four)
Kod ini menghasilkan ralat berikut:
cannot use four (type []uint8) as type uint8 in append cannot use two[:] (type []uint8) as type uint8 in append
Bertentangan dengan reputasi Go untuk kepingan teguh, ralat ini nampaknya tidak dapat dijelaskan. Untuk memahami dan menyelesaikan isu ini, kita perlu menyelidiki Spesifikasi Bahasa Pengaturcaraan Go.
Memahami Spesifikasi
Menurut Spesifikasi Go, fungsi append mengambil masa kepingan s jenis S dan sifar atau lebih nilai x jenis T, dengan T ialah jenis unsur S. Hasilnya ialah kepingan baharu jenis S dengan unsur s diikuti dengan unsur-unsur x.
Yang penting, untuk hujah terakhir, jika ia boleh diserahkan kepada jenis hirisan []T, ia boleh dihantar tidak berubah sebagai nilai untuk parameter ...T jika diikuti dengan ....
Mengatasi Ralat
Dalam kod yang disediakan, hujah akhir untuk ditambahkan tidak diikuti dengan .... Untuk menyelesaikan ini, kita perlu menyatakan []T... secara eksplisit untuk hujah terakhir. Dalam kes kami, T ialah bait, jadi kodnya hendaklah:
fmt.Println(append(one[:], two[:]...))
Untuk contoh kedua, kita harus membuat pengubahsuaian yang serupa:
five := append(three, four...)
Nota Tambahan
Kesimpulan
Dengan memahami nuansa fungsi tambah dan garis panduan Spesifikasi Go untuk argumen variadic, kami boleh menambahkan tatasusunan bait dengan berkesan dalam Go dan elakkan ralat yang ditemui dalam kod asal.
Atas ialah kandungan terperinci Bagaimana untuk Menambah Slices Byte dan Array dengan Betul dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!