【发布时间】:2019-01-26 15:48:30
【问题描述】:
我正在尝试找出打电话给this function 的正确方法:
size_t
fz_buffer_storage(fz_context *ctx, fz_buffer *buf, unsigned char **datap)
{
if (datap)
*datap = (buf ? buf->data : NULL);
return (buf ? buf->len : 0);
}
使用 CGo 获取底层字符串及其长度作为 Go 中的字节数组。
这是正确的做法吗?
var bufferContents *C.uchar
length := C.fz_buffer_storage(ctx, buf, &bufferContents)
bytes := C.GoBytes(unsafe.Pointer(bufferContents), C.int(length))
由于 C 代码覆盖了*datap,我不确定垃圾收集器是否仍然会做正确的事情。
我看到一个答案 here 提出了一些类似的建议
var tempUcharPtr *C.uchar
bufferContents := C.malloc(C.size_t(unsafe.Sizeof(tempUcharPtr)))
defer C.free(bufferContents)
length := C.fz_buffer_storage(ctx, buf, (**C.uchar)(bufferContents))
bytes := C.GoBytes(unsafe.Pointer(*(**C.uchar)(bufferContents)), C.int(length))
这似乎也有效,但它更令人费解,我想知道它是否比以前的版本更好/更安全。
【问题讨论】:
标签: c pointers go garbage-collection cgo