原文地址:http://goworldgs.com/?p=37
在C语言中有一个经典的宏定义,可以将结构体struct内部的某个成员的指针转化为结构体自身的指针。下面是一个例子,通过FIELD_OFFSET宏计算结构体内一个字段的偏移,函数getT可以从一个F*的指针获得对应的T*对象。
struct F {
int c;
int d;
}
struct T{
int a;
int b;
struct F f;
}
#define FIELD_OFFSET(type, field) ((int)(unsigned char *)(((struct type *)0)->field))
struct T* getT(struct F* f) {
return (T*)((unsigned char *)f - FIELD_OFFSET(T, F))
}
在Golang中能否实现同样的功能?尝试写如下的代码:
type T struct {
a int
b int
f F
}
type F struct {
c int
d int
}
func (m *F) T1() *T {
var dummy *T
fieldOffset := uintptr(unsafe.Pointer(&dummy.f)) - uintptr(unsafe.Pointer(dummy))
return (*T)(unsafe.Pointer((uintptr)(unsafe.Pointer(m)) - fieldOffset))
}
编译通过&