Initialization
var s Struct
编译器自动初始化分配内存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 }
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{}