Cara untuk memulakan tatasusunan atau hirisan dengan cekap daripada tatasusunan tidak selamat.Penunjuk dalam Go
Dalam dunia Go, anda mungkin menghadapi senario di mana anda perlu bekerja dengan struktur data yang diwakili sebagai tidak selamat.Penunjuk. Sebagai contoh, anda mungkin mempunyai penuding kepada tatasusunan seperti:
p := uintptr(unsafe.Pointer(&array)) size := 5
Walau bagaimanapun, mengakses tatasusunan secara terus tidak boleh dilaksanakan, kerana penuding hanyalah perwakilan alamatnya. Ini memberi anda cabaran untuk mencipta tatasusunan atau kepingan menggunakan penunjuk, saiz dan jenis data yang diketahui tanpa menggunakan salinan memori.
Pendekatan Tidak Selamat untuk Penciptaan Array/Slice
Pada mulanya, anda boleh mempertimbangkan pendekatan berikut:
data := make([]byte, size) stepSize := unsafe.Sizeof(data[0]) for i := 0; i < size; i++ { data[i] = *(*byte)(unsafe.Pointer(p)) p += stepSize }
Penyelesaian ini menyalin data daripada tatasusunan asal kepada yang baharu slice, yang boleh menjadi tidak cekap, terutamanya untuk set data yang besar.
Pendekatan Cekap menggunakan reflect.SliceHeader
Alternatif yang lebih cekap ialah memanfaatkan kuasa pakej pantulan Go dan jenis pantulan.SliceHeader. Dengan memanipulasi secara langsung medan reflect.SliceHeader, anda boleh membuat tatasusunan atau hirisan yang merujuk data asas yang sama seperti penuding anda.
Langkah 1: Dapatkan reflect.SliceHeader deskriptor
Isytihar pembolehubah hirisan dan hantar jenis []baitnya ke *reflect.SliceHeader menggunakan penukaran yang tidak selamat:
var data []byte sh := (*reflect.SliceHeader)(unsafe.Pointer(&data))
Langkah 2: Ubah suai medan SliceHeader
Tetapkan penunjuk, saiz dan secara pilihan, kapasiti kepada medan pantulan.SliceHeader:
sh.Data = p sh.Len = size sh.Cap = size
Langkah 3: Tukar semula kepada asal jenis data
Akhir sekali, hantar refleksi yang diubah suai.SliceHeader kembali ke jenis data yang anda inginkan menggunakan penukaran yang tidak selamat:
data = *(*[]byte)(unsafe.Pointer(sh))
Pendekatan cekap ini membolehkan anda membuat tatasusunan atau kepingan yang berkongsi data asas yang sama seperti penunjuk anda tanpa menanggung kos salinan memori yang tidak diperlukan.
Atas ialah kandungan terperinci Bagaimana Mencipta Tatasusunan atau Slice Go dengan Cekap daripada penunjuk yang tidak selamat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!