基本语法
语法 | 作用 | |
---|---|---|
make | func make(Type, args) |
分配内存,返回一个初始化的数据结构(但若len设置为0,那就没初始化) 只能创建slice、channel、map |
new | func **<font style="color:rgb(51, 51, 51);">new</font>**(Type) *Type |
用于分配内存并返回一个指向该内存的指针。它通常用于创建用户定义的类型的实例,如结构体(struct) |
NOTE:未初始化的标志
- 初始化的标志是:切片有指向底层数组的指针,如果是二维以上,还需要保证作为元素的切片,也要保证有指向底层数组的指针
- 未初始化的表现
len =0
- 元素全为
nil
- 注意,经过make函数生成切片,如
x :=make([]int, 0, 3)
,并没初始化,x[0]
或者x[2]
都是会报错的,也就是说,及时经过make函数创建,也并一定初始化 fmt.println(x)
并不会显示[nil, nil, nil]
只会显示[]
- 只有
x :=make([]int, 2, 3); fmt.println(x)
,才会显示[0, 0]
- 注意,经过make函数生成切片,如
应用场景
slice
func make(Type, len, cap)
len是必选参数,cap是可选参数(要求cap >= len;若省略cap,则cap=len)
- 一维切片
返回什么? | 注意点 | |
---|---|---|
make([]int, 2, 4) |
[0, 0, nil, nil] (后面的nil不显示,我为了直观写出来的) |
有长度的部分默认为零值 |
make([]int, 0, 4) |
nil | 实际此时切片未初始化,因为len = 0,不可调用,但可以append |
make([]int) |
按语法书来说不和规矩,但我确实有时候看到了,应该是创建了一个len和cap都为0的切片 | 不可以调用,但可以append,等同于slice := []int{} |
- 二维切片
- 初始化问题
- 为初始化完全不能调用(本质是不能
nil.xxx
之类的),只能append
- 初始化问题
channel
myMap := make(map[K]V, capacity)
- K 表示映射的键类型。
- V 表示映射的值类型。
- capacity 表示映射的初始大小,即可以容纳的键值对数量。这个参数是可选的,如果省略,映射将以默认大小创建。
map
ch := make(chan T, capacity)
- T 表示通道中传输的数据的类型。
- capacity 表示通道的容量,即可以缓存的元素数量。这个参数是可选的,如果省略,将创建一个无缓冲的通道。