cgo:将`[]uchar`转换为`[]字节`

cgo:将`[]uchar`转换为`[]字节`,go,cgo,Go,Cgo,首先,cgo非常酷,谢谢:) 不过,我确实有一个问题,我有很多C结构只包含一个字节数组,我想将其中的数组用作[]字节。即: typedef struct { unsigned char data[64]; } pubkey; 我希望能够做到: type SchnorrPublicKey struct { pubkey C.pubkey } func (key *SchnorrPublicKey) String() string { return hex.EncodeT

首先,cgo非常酷,谢谢:)

不过,我确实有一个问题,我有很多C结构只包含一个字节数组,我想将其中的数组用作
[]字节。即:

typedef struct {
    unsigned char data[64];
} pubkey;
我希望能够做到:

type SchnorrPublicKey struct {
    pubkey C.pubkey
}

func (key *SchnorrPublicKey) String() string {
    return hex.EncodeToString(key.pubkey.data[:])
}
但我得到了以下错误:
/schnorr.go:39:43:无法将key.pubkey.data[:](type[]\u Ctype\u uchar)用作hex.EncodeToString参数中的类型[]字节
我可以通过执行以下操作来实现这一点:
返回十六进制编码字符串(C.GoBytes(不安全的.Pointer(&key.pubkey.data[0])、C.int(len(key.pubkey.data)))

但是感觉有点愚蠢,将一个已经过的go片转换成另一个go片只是为了将
\Ctype\uchar
类型替换为
byte
类型是非常复杂的,而且它们都是100%兼容的


有没有更好的方法可以做到这一点?

有一个公开的功能提案可以在中实现这一点

同时,如果切片的大小有一个恒定的上限(在本例中,
64
):

var cPtr=&key.pubkey.data[0]
常数上限=64
变量n=64
切片:=(*[上限]字节)(不安全的.指针(cPtr))[:n:n]

如果没有,请参阅中的函数。

首先为什么要使用
[]C.uchar
\u Ctype\u uchar
在Go中没有多大用处,而切片在C中也没有多大用处。似乎不创建这样的混合类型会更容易。这是cgo在Go中自动生成C结构的结果。
无符号字符数据[64]数组在go中表示为
[].\u Ctype\u uchar
我怀疑它是否在创建
[].\u Ctype\u uchar
,否则您不需要
[:]
切片符号
GoBytes
是将数据复制到Go内存中的正确功能,或者:,这里也介绍了这一点: