在Go中,第一个字段的地址即为结构体地址
观察代码运行结果,理解golang对象与字段地址的偏移计算
说明:Pointer和uintptr方法可以理解为本质上都是指针,前者一般用来转化类型,后者用来计算地址
type Buffer struct {
buf [1500]byte
n int8
}
func main() {
instance := new(Buffer)
{
println(instance)
println(instance.buf[:])
println(&instance.buf[0])
b := (*Buffer)(unsafe.Pointer(&instance.buf[0])) // 根据buf字段算出实例对象的地址
println(b.buf[:])
}
{
println(&instance.n)
println(unsafe.Offsetof(instance.n))
println(unsafe.Pointer(uintptr(unsafe.Pointer(&instance.n)) - unsafe.Offsetof(instance.n))) // 根据n字段地址算出实例对象的地址
}
}