5

如何转换此 C(数组)类型:

char my_buf[BUF_SIZE];

到这个 Go (array) 类型:

type buffer [C.BUF_SIZE]byte

? 尝试进行接口转换会给我这个错误:

cannot convert (*_Cvar_my_buf) (type [1024]C.char) to type [1024]byte
4

2 回答 2

8

最简单和最安全的方法是将其复制到切片中,而不是专门复制到[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))
于 2014-12-17T19:00:47.377 回答
2

使用 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))
于 2014-12-17T19:01:59.443 回答