C 在go-lang中转换为结构类型

C 在go-lang中转换为结构类型,c,go,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 } 但是是的,它不工作,我得到了编译器错误“无法将

我有一些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(也可以是其他类型)


我怎样才能做到这一点?

您不能在Go中将指针强制转换为任意类型。如果确实要这样做,应使用不安全的指针:

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
}

您不能在Go中将指针强制转换为任意类型。如果确实要这样做,应使用不安全的指针:

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
}

@Varun:虽然第一个示例可以编译,但不能在
uintpttr
中保留指针值。它们后面没有GC,将收集引用的对象。如果实际指针存储在某个地方,则可以使用
uintpttr
,但应该使用正确的类型、接口或
不安全的指针。指针
@Varun:尽管第一个示例可以编译,但不能在
uintpttr
中保留指针值。它们后面没有GC,将收集引用的对象。如果实际指针存储在某个位置,则可以使用
uintptr
,但应该使用正确的类型、接口或
unsafe.pointer