2 回答
TA贡献1884条经验 获得超4个赞
将 uintptr 转换为上指针是非法的。您必须阅读规则: https://golang.org/pkg/unsafe/#Pointer
但有一种 hacky 方法,不应该产生警告:
//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))
函数接受指针,但我们从运行时将它们链接为 uintptr,因为它们具有相同的 sizeof。
理论上可能有效。但也被人皱眉。
回到你的代码,你可以用一行代码来完成:
name := C.GoString((*C.char)(unsafe.Pointer(r)))
TA贡献1815条经验 获得超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 关注
- 242 浏览
添加回答
举报