在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字段地址算出实例对象的地址
	}
}