make使用在slice,map,chan这三种数据类型上面,用来分配和初始化这三种数据类型
1、slice使用make
slice使用了make设置了大小实际上是在slice里面添加了len个空数据(数据值和类型默认值相同),如果append就相当于在后面添加了新的元素:
func main() {
//1、初始化一个切片,不指定容量时则容量默认和长度一样
arr := make([]int, 10)
fmt.Println("长度为:", len(arr), "内容为:", arr, "容量为:", cap(arr))
arr = append(arr, 1)
fmt.Println("长度为:", len(arr), "内容为:", arr, "容量为:", cap(arr))
//2、初始化一个指定长度和容量的切片
arr1 := make([]int, 10, 20)
fmt.Println("长度为:", len(arr1), "内容为:", arr1, "容量为:", cap(arr1))
}
结果:
长度为: 10 内容为: [0 0 0 0 0 0 0 0 0 0] 容量为: 10
长度为: 11 内容为: [0 0 0 0 0 0 0 0 0 0 1] 容量为: 20
长度为: 10 内容为: [0 0 0 0 0 0 0 0 0 0] 容量为: 20
使用append往slice里面加元素时,如果长度大于初始容量,这时切片就会发生扩容,一般会扩容到原来的两倍!
2、map使用make
map在使用make的时候,就算指定了len,也是不起作用的,这个len起不到限制的作用
func main() {
//1、初始化一个不指定len的map
arr := make(map[int]string)
fmt.Println("长度为:", len(arr), "数据为:", arr)
//2、初始化一个指定len的map
arr1 := make(map[int]string, 5)
fmt.Println("长度为:", len(arr1), "数据为:", arr1)
}
结果:
长度为: 0 数据为: map[]
长度为: 0 数据为: map[]