如何将[1024] C.char转换为[1024]字节

Att*_* O. 5 go cgo

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

char my_buf[BUF_SIZE];
Run Code Online (Sandbox Code Playgroud)

这个Go(数组)类型:

type buffer [C.BUF_SIZE]byte
Run Code Online (Sandbox Code Playgroud)

?尝试进行界面转换会给我这个错误:

cannot convert (*_Cvar_my_buf) (type [1024]C.char) to type [1024]byte
Run Code Online (Sandbox Code Playgroud)

Jim*_*imB 8

最简单,最安全的方法是将其复制到切片,而不是专门用于切片 [1024]byte

mySlice := C.GoBytes(unsafe.Pointer(&C.my_buff), C.BUFF_SIZE)
Run Code Online (Sandbox Code Playgroud)

要在没有副本的情况下直接使用内存,您可以通过"转换"它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))
Run Code Online (Sandbox Code Playgroud)

  • 巨大的数组只是为了让go编译器接受任何有效的大小,但它实际上并没有被分配(参见https://github.com/golang/go/wiki/cgo)中的其他一些例子. (2认同)