Golang中Ccgo编译错误:无法将类型MqTypeE作为uint32赋值
Golang中Ccgo编译错误:无法将类型MqTypeE作为uint32赋值 我在使用原生“C”类型时遇到了编译问题。 我的问题是,从 MqTypeE 转换为 enum MqTypeE 时出现了错误。 两种类型的大小都是 uint32。
如果我跳过 MqTypeE 的定义,直接用 uint32 替换它,那么编译就不会出现错误。
我期望在相同类型之间的转换不会产生错误。
代码:
func (this *MqBufferC) CastTo (typ MqTypeE) {
hdl := this.getHdl()
var errVal C.enum_MqErrorE = C.MqBufferCastTo (hdl, typ)
if (errVal == C.MQ_ERROR) { MqErrorEException((C.MQ_MNG)(hdl), errVal) }
}
错误:
不能在赋值中使用 typ(类型 MqTypeE)作为 uint32 类型
C.MqBufferCastTo:
MQ_EXTERN enum MqErrorE
MQ_DECL MqBufferCastTo (
MQ_BUF const buf,
enum MqTypeE const typ
) __attribute__((nonnull (1)));
Go 中的 MqTypeE:
type MqTypeE C.enum_MqTypeE
C 中的 MqTypeE:
enum MqTypeE {
MQ_BYTT = (1<<4 | MQ_TYPE_IS_1_BYTE), ///< Y: 1 字节 'byte' 类型
MQ_BOLT = (2<<4 | MQ_TYPE_IS_1_BYTE), ///< O: 1 字节 'boolean' 类型
MQ_SRTT = (3<<4 | MQ_TYPE_IS_2_BYTE), ///< S: 2 字节 'short' 类型
MQ_INTT = (4<<4 | MQ_TYPE_IS_4_BYTE), ///< I: 4 字节 'int' 类型
MQ_FLTT = (5<<4 | MQ_TYPE_IS_4_BYTE), ///< F: 4 字节 'float' 类型
MQ_WIDT = (6<<4 | MQ_TYPE_IS_8_BYTE), ///< W: 8 字节 'long long int' 类型
MQ_DBLT = (7<<4 | MQ_TYPE_IS_8_BYTE), ///< D: 8 字节 'double' 类型
MQ_TRAT = (8<<4 | MQ_TYPE_IS_8_BYTE), ///< T: 8 字节 'transaction' 类型
MQ_BINT = (9<<4 ), ///< B: \e 字节数组类型
MQ_STRT = (10<<4 ), ///< C: \e 字符串类型(例如末尾有 \\0)
MQ_LSTT = (11<<4 ), ///< L: 列表对象类型
};
更多关于Golang中Ccgo编译错误:无法将类型MqTypeE作为uint32赋值的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于Golang中Ccgo编译错误:无法将类型MqTypeE作为uint32赋值的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
这是一个典型的Go与C类型系统交互问题。MqTypeE在Go中被定义为C.enum_MqTypeE,虽然底层都是uint32,但Go将其视为不同的命名类型。
问题在于Go的强类型系统:即使MqTypeE和C.enum_MqTypeE底层类型相同,它们也不能直接相互赋值。需要显式类型转换。
修改你的代码,添加显式类型转换:
func (this *MqBufferC) CastTo(typ MqTypeE) {
hdl := this.getHdl()
// 将 MqTypeE 显式转换为 C.enum_MqTypeE
var errVal C.enum_MqErrorE = C.MqBufferCastTo(hdl, C.enum_MqTypeE(typ))
if errVal == C.MQ_ERROR {
MqErrorEException((C.MQ_MNG)(hdl), errVal)
}
}
或者更简洁的写法:
func (this *MqBufferC) CastTo(typ MqTypeE) {
hdl := this.getHdl()
errVal := C.MqBufferCastTo(hdl, C.enum_MqTypeE(typ))
if errVal == C.MQ_ERROR {
MqErrorEException((C.MQ_MNG)(hdl), errVal)
}
}
如果你经常需要进行这种转换,可以定义一个辅助函数:
func toCType(typ MqTypeE) C.enum_MqTypeE {
return C.enum_MqTypeE(typ)
}
func (this *MqBufferC) CastTo(typ MqTypeE) {
hdl := this.getHdl()
errVal := C.MqBufferCastTo(hdl, toCType(typ))
if errVal == C.MQ_ERROR {
MqErrorEException((C.MQ_MNG)(hdl), errVal)
}
}
这种类型转换是安全的,因为两种类型底层表示完全相同(都是uint32),只是Go的类型系统要求显式转换。

