2 回答

TA貢獻1884條經(jīng)驗 獲得超4個贊
將 uintptr 轉換為上指針是非法的。您必須閱讀規(guī)則:?https://golang.org/pkg/unsafe/#Pointer
但有一種 hacky 方法,不應該產(chǎn)生警告:
//go:linkname gostringn? ? ?runtime.gostringn
func gostringn(p uintptr, l int) string
//go:linkname findnull? ? ?runtime.findnull
//go:nosplit
func findnull(s uintptr) int
// ....
name := gostringn(r, findnull(r))
函數(shù)接受指針,但我們從運行時將它們鏈接為 uintptr,因為它們具有相同的 sizeof。
理論上可能有效。但也被人皺眉。
回到你的代碼,你可以用一行代碼來完成:
name := C.GoString((*C.char)(unsafe.Pointer(r)))

TA貢獻1815條經(jīng)驗 獲得超13個贊
我通過跟蹤go源碼得到了以下解決方案os.Args,但是我是基于go1.17。如果您是其他版本,可以閱讀源碼來解決。
func UintPtrToString(r uintptr) string {
p := (*uint16)(unsafe.Pointer(r))
if p == nil {
return ""
}
n, end, add := 0, unsafe.Pointer(p), unsafe.Sizeof(*p)
for *(*uint16)(end) != 0 {
end = unsafe.Add(end, add)
n++
}
return string(utf16.Decode(unsafe.Slice(p, n)))
}
- 2 回答
- 0 關注
- 347 瀏覽
添加回答
舉報