数组
1 | // 常规声明 |
数组类型比较
不同长度长度数组的是不同的数据类型
1 | a := [2]int{1,2} |
既然长度不同那么就无法比较,无法类型转换
1 | // 大家应该知道[]byte 类型和字符串类型是可以互相转换的 |
数组与切片的区别
切片 Slice
定义切片 s := []类型 {}
数组 array
定义数组 a := [n]类型{}
从上面的例子可以看出,数组和切片 定义的方式是不同的,其实也能体现数切片和数组的区别,数组是有固定长度,在声明它的时候就必须给定,并且在之后不会再改变。
而切片类型的值是可变长的。而切片的类型字面量中只有其元素的类型,而没有其长度。切片的长度可以自动地随着其中元素数量的增长而增长,但不会随着元素数量的减少而减少。在每一个切片的底层数据结构中,会包含指向底层数组的指针,而切片就是对底层数组的引用,故而切片类型属于引用类型。
切片扩容
1 | a := []int{} |
根据切片的元素类型、当前切片以及新切片所需的最小容量(即新切片的长度)进行扩容,返回一个至少具有指定容量的新切片,并将旧切片中的数据拷贝过去。
如果新切片所需的最小容量大于当前切片容量的两倍,那么就直接用新切片所需的最小容量
如果新切片所需的最小容量小于等于当前切片的容量的两倍
如果当前切片的容量小于 1024 ,则直接把当前切片的容量翻倍作为新切片的容量
如果当前切片的容量大于等于 1024 ,则每次递增切片容量的 1/4 倍,直到大于新切片所需的最小容量为止。