Soalan:
Diberi penunjuk tidak selamat kepada tatasusunan, bagaimana kita boleh membuat tatasusunan atau kepingan daripadanya tanpa menanggung kos ingatan copy?
Jawapan:
Mencipta Slice Menggunakan Reflect:
Pendekatan yang disyorkan ialah menggunakan pakej reflect untuk buat pengepala hirisan yang menunjuk kepada data asas yang sama seperti yang tidak selamat penunjuk.
// Create a slice header sh := &reflect.SliceHeader{ Data: p, // Unsafe pointer to the array Len: size, Cap: size, } // Use the slice header to create a slice data := *(*[]byte)(unsafe.Pointer(sh))
Mencipta Tatasusunan Menggunakan Reflect:
Untuk mencipta tatasusunan (penunjuk kepada elemen dalam ingatan bersebelahan) daripada penuding yang tidak selamat, kita boleh buat dahulu sepotong dan kemudian ambil alamatnya:
// Create a slice data := *(*[]byte)(unsafe.Pointer(&reflect.SliceHeader{ Data: p, Len: size, Cap: size, })) // Get the address of the slice (pointer to the first element) arr := (*[size]byte)(unsafe.Pointer(&data[0]))
Kaveat dan Amaran:
Atas ialah kandungan terperinci Bagaimana untuk Mencipta Go Slice atau Array dengan Selamat daripada `unsafe.Pointer`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!