gpt4 book ai didi

go - 访问字符串的原始字节

转载 作者:IT王子 更新时间:2023-10-29 01:34:49 24 4
gpt4 key购买 nike

我正在尝试调用一个 C 函数,该函数需要来自 go 的 C 字符串 (char*)。我知道 cgo documentation 中记录的 C.CString 函数但由于我正在调用的函数已经制作了一份副本,所以我试图避免 Cstring 制作的副本。

现在,我正在这样做,s 是一个 go string

 var cs *C.char = (*C.char)( unsafe.Pointer(& []byte(s) [0]))

但我感觉 []bytes(s) 正在制作自己的副本。是否可以只获取 char*

最佳答案

如果您这样做的次数足够多以至于性能成为一个问题,那么一开始就将数据保存在一个 slice 中确实是明智的。

如果真的想访问字符串的地址,可以使用unsafe包,将其转换成匹配字符串头的struct。使用 reflect.StringHeader 类型:

p := unsafe.Pointer((*(*reflect.StringHeader)(unsafe.Pointer(&s))).Data)

或者使用 slice 作为代理,因为它们都将数据指针和长度整数放在相同的字段位置

p := unsafe.Pointer(&(*(*[]byte)(unsafe.Pointer(&s)))[0])

或者因为数据指针在前,你可以单独使用一个uintptr

p := unsafe.Pointer(*(*uintptr)(unsafe.Pointer(&s)))

https://play.golang.org/p/ps1Py7Ax6QK

这些方法都不能保证在所有情况下或在 Go 的 future 版本中都有效,并且没有一个选项可以保证以 null 结尾的字符串。

最好的、受支持的选项是在 cgo 序言中创建一个垫片以接受 go 字符串,并将其转换为 *char。 CGO 提供对以下功能的访问以执行此操作:

const char *_GoStringPtr(_GoString_ s);

参见 Go references to C文档中的部分。

关于go - 访问字符串的原始字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49453875/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com