Initialization

type Person struct {
	id int
	name string
}

var p_1 *Person = new(Person)

struct 和 int/float 一样是值类型,值类型内存紧凑,大小固定,对 GC 和内存访问友好

type Point struct { X, Y int }
type Rect1 struct { Min, Max Point }
type Rect2 struct { Min, Max *Point }

Untitled

Point Rect1 Rect2 在内存中是连续的

由于值类型赋值会进行拷贝,需要改变其值时,定义为指针类型

cannot assign to a field of a map element directly:

m := map[int]student {
	1: {name: "noah"},
}
m[1].name = "alice" // error

m[1] 得到的是原有 struct 的拷贝,同时这里的赋值是一个 read-modify-write 操作,很难保证原子性

// use temp var
tmp := m[1]
tmp.name = "alice"
m[1] = tmp

// use pointer
m := map[int]*student{1: { name: "noah" }}
m[1].name = "alice"

struct{} & interface{}

An empty interface has zero methods. so, in essence, any data type implements or satisfies interface{}