我试图将this c++转换为。
这就是c代码的作用:
static const char *pSharedMem = NULL;
int sessionInfoOffset;
return pSharedMem + pHeader->sessionInfoOffset;
这是我的(伪)去代码:
var pSharedMem unsafe.Pointer
sessionInfoLen C.int
byteSlice := C.GoBytes(pSharedMem, pHeader.sessionInfoLen)
return byteSlice[pHeader.sessionInfoOffset:]
我从未真正编写任何C代码,我不知道这是否是从unsafe.Pointer检索字节切片的好方法。可能有任何不妥之处(复制错误的记忆或其他东西)并且这是我在做一些非常愚蠢的事情的表现吗?
答案 0 :(得分:1)
GoBytes
将是最安全的方法。您仍然必须确保整个复制操作都存在该数组,但是一旦复制了这些字节,您就知道它无法从cgo中更改。只要复制的内存不是太大,或者副本存在性能问题,就可以采用这种方式了。
如果要通过切片直接访问字节,可以将其切片为数组:
size := pHeader.sessionInfoLen
byteSlice := (*[1<<30]byte)(pSharedMem)[:size:size]
这可以节省您的副本,但您必须管理来自cgo的并发访问,并确保在您从Go访问它时不释放内存。