【发布时间】:2015-02-16 09:51:15
【问题描述】:
如何转换这个C(数组)类型:
char my_buf[BUF_SIZE];
到这个 Go(数组)类型:
type buffer [C.BUF_SIZE]byte
?尝试进行接口转换会给我这个错误:
cannot convert (*_Cvar_my_buf) (type [1024]C.char) to type [1024]byte
【问题讨论】:
如何转换这个C(数组)类型:
char my_buf[BUF_SIZE];
到这个 Go(数组)类型:
type buffer [C.BUF_SIZE]byte
?尝试进行接口转换会给我这个错误:
cannot convert (*_Cvar_my_buf) (type [1024]C.char) to type [1024]byte
【问题讨论】:
最简单和最安全的方法是将其复制到一个切片中,而不是专门复制到[1024]byte
mySlice := C.GoBytes(unsafe.Pointer(&C.my_buff), C.BUFF_SIZE)
要直接使用内存而不使用副本,您可以通过unsafe.Pointer“投射”它。
mySlice := (*[1 << 30]byte)(unsafe.Pointer(&C.my_buf))[:int(C.BUFF_SIZE):int(C.BUFF_SIZE)]
// or for an array if BUFF_SIZE is a constant
myArray := *(*[C.BUFF_SIZE]byte)(unsafe.Pointer(&C.my_buf))
【讨论】:
C.BUF_SIZE 是 一个常量,所以我可以在 typedef 中使用它。还有,为什么要把它转换成指向一个巨大数组的指针呢?
使用 C.my_buf 的内容创建一个 Go 切片:
arr := C.GoBytes(unsafe.Pointer(&C.my_buf), C.BUF_SIZE)
创建一个 Go 数组...
var arr [C.BUF_SIZE]byte
copy(arr[:], C.GoBytes(unsafe.Pointer(&C.my_buf), C.BUF_SIZE))
【讨论】:
DEFINE 视为常量。在这种情况下确实有效。
copy 内置完成的。还有@tidwall,为什么要取C.by_buf[0]的地址?那不是和取C.my_buf的地址一样吗?
C.GoBytes 将数据复制到一个新切片中。