综述
变量声明时未赋初值,则变量被自动赋值为该类型的零值(固定值)
func new(Type) *Type
new()返回一个指针,指向新分配的该类型的零值,不是空指针(nil)。the value returned is a pointer to a newly allocated zero value of that type.
func make(t Type, size ...IntegerType) Type
make()只适用于slice、map、chan,此三种类型创建时推荐使用make()而不是new()。The make built-in function allocates and initializes an object of type slice, map, or chan (only). Unlike new, make's return type is the same as the type of its argument, not a pointer to it. The specification of the result depends on the type:
如下将按照类型实体、指针、new/make、类型比较等详述各种数据类型。
2. 数组
数组是值类型而不是引用类型。当数组赋值给一个变量时,该变量会得到一个原始数组的副本。对新变量的更改,不会影响原始数组。
数组实体被初始化数组值类型的零值,如int零值为0,string零值为""。
数组指针初始化为nil。
new()返回指向类型零值的指针。
数组是值类型,可以直接比较。
运行结果:
3. 切片
切片是值类型而不是引用类型。切片本身不拥有任何数据,只是对现有数组的引用。对切片的所有修改都会反映到底层数组上。
切片实体初始化为切片类型的零值 nil。一个 nil 切片的长度和容量为 0。
切片指针初始化为nil。
make返回类型零值的切片,非nil。
切片只能和nil作比较,要比较切片需比较切片的每个元素值。
运行结果:
4. map
Map是引用类型,当 map 被赋值为一个新变量的时候,它们指向同一个内部数据结构。因此,改变其中一个变量,就会影响到另一变量。
map的零值是nil,不能插入元素。map没有容量的概念,其长度为目前元素的个数。
只要map不为nil就可以无限插入元素。“map[]=”插入元素。
map实体初始化为nil。需要make()或“=map[int]int{}”进行初始化后才能加元素。
map指针初始化为nil。
make返回类型零值的map,且长度为0,无论make中是否指定len或指定len大小。
map只能和nil作比较。要比较map,需比较两个map的每个元素。
运行结果:
5. struct
结构体是值类型,可以直接用=赋值。
结构体实体初始化为每个成员的零值,仅为某些字段指定初始值时,忽略的字段会赋值为零值。
结构体指针值为nil。
new()返回指向类型零值的指针。
如果它的每一个字段都是可比较的,则该结构体也是可比较的。如果两个结构体变量的对应字段相等,则这两个变量也是相等的。如果结构体包含不可比较的字段,则结构体变量也不可比较。
map可以以指针和实体方式返回,函数返回后可以通过返回值访问到原来函数内部的结构体(即函数内部的结构体不会随着函数结束而被回收)。
运行结果: