2 回答

TA貢獻1829條經驗 獲得超7個贊
好吧,我找到了一個粗略的解決方案。顯然,切片的結構包含一個指向支持字節數組的指針、支持字節數組的長度以及支持字節數組的容量。
我只對指向字節數組的指針感興趣,所以我只需要切片內部數據的第一個成員。
Gounsafe.Pointer不會將切片轉換為不安全指針,但會將指向切片的指針轉換為不安全指針。由于我可以將不安全指針強制轉換為我想要的任何舊類型的指針,因此我可以將其強制轉換為指向指針的指針,從而恢復切片內部數據的第一個成員。
這是一個工作示例。我想要一個,uintptr但你可以將它轉換為任何指針類型。
package main
import (
"fmt"
"unsafe"
)
func main() {
// Arbitrary size
n := 4
// Create a slice of the correct size
m := make([]int, n)
// Use convoluted indirection to cast the first few bytes of the slice
// to an unsafe uintptr
mPtr := *(*uintptr)(unsafe.Pointer(&m))
// Check it worked
m[0] = 987
// (we have to recast the uintptr to a *int to examine it)
fmt.Println(m[0], *(*int)(unsafe.Pointer(mPtr)))
}
如果你想要一個*int,你可以做mPtr := *(**int)(unsafe.Pointer(&m))
只要切片維護此內部數據結構,這就會起作用。我絕對愿意接受不依賴于 Go 內部結構的更強大的解決方案。
- 2 回答
- 0 關注
- 273 瀏覽
添加回答
舉報