2 回答

TA貢獻(xiàn)1884條經(jīng)驗(yàn) 獲得超4個(gè)贊
將 uintptr 轉(zhuǎn)換為上指針是非法的。您必須閱讀規(guī)則:?https://golang.org/pkg/unsafe/#Pointer
但有一種 hacky 方法,不應(yīng)該產(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ù)接受指針,但我們從運(yùn)行時(shí)將它們鏈接為 uintptr,因?yàn)樗鼈兙哂邢嗤?sizeof。
理論上可能有效。但也被人皺眉。
回到你的代碼,你可以用一行代碼來(lái)完成:
name := C.GoString((*C.char)(unsafe.Pointer(r)))

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超13個(gè)贊
我通過(guò)跟蹤go源碼得到了以下解決方案os.Args,但是我是基于go1.17。如果您是其他版本,可以閱讀源碼來(lái)解決。
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 關(guān)注
- 328 瀏覽
添加回答
舉報(bào)