2 回答
TA贡献1835条经验 获得超7个赞
请参阅将 C 数组转换为 Go 切片的文档,以获取包含 C 数据的可索引 Go 切片。
由于要就地修改 C 缓冲区数据,因此使用 Go 切片作为代理,只需将同一缓冲区传递给回调即可。请注意,using 可能会为切片分配一个新的 Go 数组,因此您需要避免这种情况,并确保事先在缓冲区中有足够的可用空间。append
func goFunction(cBuffer *C.char, length int) {
slice := (*[1 << 28]C.char)(unsafe.Pointer(cBuffer))[:length:length]
// slice can now be modified using Go syntax, without pointer arithmetic
C.callback(cBuffer)
}
TA贡献1812条经验 获得超5个赞
不建议在 Go 中修改 C 结构,或在 C 中修改 Go 结构。在接口 Ref1 中转换它。
一些特殊函数通过创建数据的副本在Go和C类型之间进行转换。在伪围棋定义中
更多,为您提供一种使用零副本转换字符串的方法,Ref2。
func char2Slice(data unsafe.Pointer, len C.int) []byte {
var value []byte
sH := (*reflect.SliceHeader)(unsafe.Pointer(&value))
sH.Cap, sH.Len, sH.Data = int(len), int(len), uintptr(data)
return value
}
- 2 回答
- 0 关注
- 166 浏览
添加回答
举报