在Golang 中從unsafe.Pointer 建立切片或陣列:一種有效的替代方案
指向陣列的指標可以表示為Golang中的uintptr 值。然而,當指標儲存為 uintptr 時,存取原始陣列可能會很困難。
低效率方法:記憶體複製
一個簡單的方法是從將指標指向新切片:
data := make([]byte, size) stepSize := unsafe.Sizeof(data[0]) for i := 0; i < size; i++ { data[i] = *(*byte)(unsafe.Pointer(p)) p += stepSize }
此方法效率低,因為它涉及複製數據,這可能是對於大數組來說比較耗時。
高效方法:Reflect.SliceHeader
更有效率的方法是使用reflect.SliceHeader建立切片或數組,而不需要複製記憶體:
var data []byte sh := (*reflect.SliceHeader)(unsafe.Pointer(&data)) sh.Data = p sh.Len = size sh.Cap = size fmt.Println(data)
此方法將uintptr轉換為reflect.SliceHeader並修改其欄位指向現有陣列。產生的切片或陣列將與原始數組共享相同的底層記憶體。
替代方法:複合文字
另一種替代方法是使用複合文字來建立Reflect.Sli ceHeader:
sh := &reflect.SliceHeader{ Data: p, Len: size, Cap: size, } data := *(*[]byte)(unsafe.Pointer(sh)) fmt.Println(data)
此方法產生與之前相同的結果
注意事項
使用uintptr 指標時,確保原始陣列在指標的整個生命週期內保持有效非常重要。此外,由於 unsafe 套件對類型安全有潛在影響,因此應謹慎使用。
以上是如何從 unsafe.Pointer 有效地建立 Go 切片或陣列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!