首頁 >後端開發 >Golang >如何從「unsafe.Pointer」安全地建立 Go 切片或陣列?

如何從「unsafe.Pointer」安全地建立 Go 切片或陣列?

Susan Sarandon
Susan Sarandon原創
2024-12-10 12:08:09973瀏覽

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

Go 中如何從 unsafe.Pointer 陣列建立陣列或切片?

問題:

給定指向數組的不安全指針,我們如何在不產生內存成本的情況下創建數組或切片複製?

答案:

使用Reflect 建立切片:

建議的方法是使用Reflect 套件建立一個切片頭,該包裝頭頭指向與不安全的相同的基礎資料指標。

// 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))

使用 Reflect建立陣列:

要從不安全的指標建立陣列(指向連續記憶體中的元素的指標),我們可以先建立切片,然後取得其位址:

// 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]))

注意事項與警告:

  • 確保管理原始陣列的生命週期以防止意外的記憶體存取。
  • 避免使用uintptr 變數作為物件的引用,因為可能會發生垃圾收集
  • 如有必要,請使用runtime.KeepAlive(),以防止原始陣列在被切片引用之前被垃圾回收或從不安全指標建立的陣列。

以上是如何從「unsafe.Pointer」安全地建立 Go 切片或陣列?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn