我有一些
形式的c宏#define VARATT_IS_4B(PTR) \
((((varattrib_1b *) (PTR))->va_header & 0x80) == 0x00)
并希望将其转换为Go lang。我正在做类似
的事情func varAttIs1B(ptr uintptr) bool {
return (*varAttrib1b(ptr).vaHeader & 0x01) == 0x01
}
但是,它没有用,我收到编译错误“无法将ptr(类型int)转换为类型varAttrib1b”。
varAttrib1b是一个带有两个字段的结构,ptr是一个uintptr(也可能是其他类型)。
type varAttrib1b struct {
vaHeader uint8
vaData []string
}
我该怎么做?
答案 0 :(得分:4)
你不能在Go中向任意类型转换指针。如果你真的想这样做,你应该使用unsafe.Pointer:
type varAttrib1b struct {
vaHeader uint8
vaData []string
}
func varAttIs1B(ptr uintptr) bool {
return ((*varAttrib1b)(unsafe.Pointer(ptr)).vaHeader & 0x01) == 0x01
}
它编译和工作,但你确定没有安全的方法去做吗?你不能只定义一个界面:
type Attr interface {
AttrIs1B() bool
}
func (b varAttrib1b) AttrIs1B() bool {
return b.vaHeader & 0x01 == 0x01
}
func varAttIs1B(attr Attr) bool {
return attr.AttrIs1B()
}
或者使用类型转换实现它?
func varAttIs1B(ptr interface{}) bool {
switch a := ptr.(type) {
case varAttrib1b:
return a.vaHeader & 0x01 == 0x01
}
return false
}