从unsafe.Pointer获取特定字节片段的最佳(最安全+最高效)方法是什么?

时间:2015-03-21 22:21:19

标签: winapi go cgo

我试图将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检索字节切片的好方法。可能有任何不妥之处(复制错误的记忆或其他东西)并且这是我在做一些非常愚蠢的事情的表现吗?

1 个答案:

答案 0 :(得分:1)

GoBytes将是最安全的方法。您仍然必须确保整个复制操作都存在该数组,但是一旦复制了这些字节,您就知道它无法从cgo中更改。只要复制的内存不是太大,或者副本存在性能问题,就可以采用这种方式了。

如果要通过切片直接访问字节,可以将其切片为数组:

size := pHeader.sessionInfoLen
byteSlice := (*[1<<30]byte)(pSharedMem)[:size:size]

这可以节省您的副本,但您必须管理来自cgo的并发访问,并确保在您从Go访问它时不释放内存。