在go lang中转换为struct类型

时间:2015-05-17 13:12:36

标签: c go

我有一些

形式的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
}

我该怎么做?

1 个答案:

答案 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
}
相关问题