如何转换Go';s[]字节到C';s*uint8_t

如何转换Go';s[]字节到C';s*uint8_t,c,go,elf,cgo,C,Go,Elf,Cgo,我想使用Go在C结构中设置uint8_t*。 Go中的数据来自和ELF,是一个字节片。 这是我当前遇到的错误: 无法将&buf[0](type*byte)用作赋值中的type*\Ctype\uchar 使用此代码: args.vm\u快照\u数据=&buf[0] 我该怎么做 当我使用正确的演员阵容时: args.vm\u snapshot\u data=(*C.uint8\u t)(&buf[0]) 我得到这个错误: panic:runtime error:cgo参数具有Go pointer t

我想使用Go在C结构中设置uint8_t*。 Go中的数据来自和ELF,是一个字节片。 这是我当前遇到的错误:

无法将&buf[0](type*byte)用作赋值中的type*\Ctype\uchar

使用此代码:

args.vm\u快照\u数据=&buf[0]

我该怎么做

当我使用正确的演员阵容时:
args.vm\u snapshot\u data=(*C.uint8\u t)(&buf[0])

我得到这个错误:

panic:runtime error:cgo参数具有Go pointer to Go pointer

Golang计数类型,而不是它们的兼容性。只有一种方法可以将
unsafe.Pointer
用作原始值

args.vm_snapshot_data=(*C.uint8_t)(不安全的.Pointer(&buf[0]))
如果在C端使用buf slice时,您不确定buf slice是否在运行端处于活动状态(垃圾收集器可能会处理它),那么您必须使用copy并手动处理它

args.vm_快照_数据=(*C.uint8_t)(C.CBytes(buf))
...
C.free(不安全的指针(args.vm\u快照\u数据))

cgo类型不是
uint8\u t
,而是
C.uchar
,所以这就是您要将其转换为的类型。这无关紧要。传递一个C.uchar与传递一个C.uint8是一样的,因为在本例中,您没有将其转换为这两种类型,所以很难判断,错误是
\u Ctype\u uchar
。将其转换为所需的类型。在错误消息中,您可以看到它要求我传递一个C.uchar,但C中的字段实际上是一个uint8\t。Cgo的转换可以做到这一点,这很好,但您还没有尝试将其转换为所显示的任何一种(首先确保您确定要将Go切片传递给C。将字节复制到C分配的内存中更安全)