1. 综述

变量声明时未赋初值,则变量被自动赋值为该类型的零值(固定值)

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可以以指针和实体方式返回,函数返回后可以通过返回值访问到原来函数内部的结构体(即函数内部的结构体不会随着函数结束而被回收)。

运行结果: