结构体所有字段在内存当中是连续的
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类型的本身地址也是连续的,但是他们指向的地址不一定是连续。
结构体转换
字段名称,字段类型,字段个数都得一致才可以转。