结构体所有字段在内存当中是连续的
type Point struct {x, y int
}type Rect struct {leftUp, rightDown Point
}func main() {//r1会在内存当中有四个整数r1 := Rect{leftUp: Point{x: 1,y: 2,},rightDown: Point{x: 3,y: 4,},}//r1有四个int,在内存当中是连续分布的,打印地址fmt.Printf("%p %p %p %p", &r1.leftUp.x, &r1.leftUp.y, &r1.rightDown.x, &r1.rightDown.y)}0xc0000141a0 0xc0000141a8 0xc0000141b0 0xc0000141b8
一个int类型刚好8个字节。可以看到结构体的字段在内存当中是连续分布的,通过地址的加减来找到对应的数据。
r1 := Rect{leftUp: &Point{x: 1,y: 2,},rightDown: &Point{x: 3,y: 4,},}fmt.Printf("%p %p", &r1.leftUp, &r1.rightDown)0xc00003e260 0xc00003e268
可以看到指针的地址也是连续的。r1有两个*point类型,这个两个*Point类型的本身地址也是连续的,但是他们指向的地址不一定是连续。
结构体转换
字段名称,字段类型,字段个数都得一致才可以转。