Go中的切片和数组的概念上很像,查找一些资料后,简单的总结一下相关的区别和一些注意事项
数组与切片的声明
// 声明又给包含五个元素的整型数组
var array [5]int //数组声明后就不可改变长度
array := [...]int{10, 20, 30, 40, 50} // 用具体值初始化每个元素,容量由初始化值的数量决定
array := [5]int{1: 10, 2: 20} // 声明具有五个元素的素组,用具体值初始化索引为1,2的元素
// 创建一个字符串切片,长度容量都是五个元素
slice := make([]string, 5)
// 创建一个整型切片,长度3容量5,不允许创建容量小于长度的切片
slice := make([]int, 3, 5)
// 使用切片字面量,不需要指定[]运算符内的值
slice := []string{"red", "blue", "green", "yellow", "pink"}
slice := []int{10, 20, 30}
// 创建并初始化值
slice := []string{99:""} // 长度和容量都是100
var slice []int // 创建nil整型切片,在声明不做任何初始化
slice := source[2:3] // 长度j-i(3-2),容量相同
slice := source[2:3:4] // 长度j-i(3-2),容量k-i(4-2)
切片与数组声明的区别:[]内是否有指定值
切片是一种数据结构,切片之所以被称为切片,是因为创建一个新的切片就是把底层数组切出一部分
切片注意事项
- 切片只能访问到长度内的元素
- 可用append增加元素,不过需要赋值回原数组
- 切片操作s[2:5],s[:5],s[2:]
append
slice := []int{10, 20, 40, 40} // 长度容量均为4
newSlice := append(slice, 50) // 追加一个值
切片底层如果还有容量可用,append会将可用元素合并到切片的长度,并赋值。原始的slice对应位置也会被改变。如果没有,将创建一个新的底层数组,将被引用的现有的值复制到新数组里,再追加新的值,新数组容量为原来的两倍。