Go里的数组和切片

70 阅读2分钟

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)

切片与数组声明的区别:[]内是否有指定值

切片是一种数据结构,切片之所以被称为切片,是因为创建一个新的切片就是把底层数组切出一部分

切片注意事项

  1. 切片只能访问到长度内的元素
  2. 可用append增加元素,不过需要赋值回原数组
  3. 切片操作s[2:5],s[:5],s[2:]

append

 slice := []int{10, 20, 40, 40}  // 长度容量均为4
 newSlice := append(slice, 50)  // 追加一个值

切片底层如果还有容量可用,append会将可用元素合并到切片的长度,并赋值。原始的slice对应位置也会被改变。如果没有,将创建一个新的底层数组,将被引用的现有的值复制到新数组里,再追加新的值,新数组容量为原来的两倍。