Rumah > pembangunan bahagian belakang > Golang > Bagaimana Mencipta Tatasusunan atau Slice Go dengan Cekap daripada penunjuk yang tidak selamat?

Bagaimana Mencipta Tatasusunan atau Slice Go dengan Cekap daripada penunjuk yang tidak selamat?

Barbara Streisand
Lepaskan: 2024-12-11 02:25:16
asal
628 orang telah melayarinya

How to Efficiently Create a Go Array or Slice from an unsafe.Pointer?

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

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

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

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

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

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!

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