1、切片
切片是数组的一个引用,因此切片是引用类型,在进行传递时,遵守引用类型的机制
切片的使用和数组类似,如遍历切片,访问切片的元素和求切片长度len(slice)都一样。
切片的长度是可以变化的,因此切片是一个可以动态变化的数组
2、切片的定义
var 切片名 []类型 比如: var a []int
3、切片的使用
3.1 通过引用一个已声明好的数组
func main() { intArr := [...]int{0, 1, 2, 3, 4, 5, 6} slice := intArr[1:6] }
slice是一个切片
intArr[1:6]表示引用到intArr这个数组
引用intArr数组的起始下标为1,最后的下标为3(但是不包含3)
3.2 通过make来创建切片
基本语法:var 切片名 []type = make([]type,len,cap)
参数说明:type就是数据类型,len为长度,cap为容量(可选),cap不小于len
func main() { var slice []int = make([]int, 5, 10) // slice必须make后才能使用 slice[0] = 1 slice[4] = 9 }
通过make方式创建切片可以指定切片的大小和容量
如果没有给切片的各个元素赋值,那么就会使用默认值,
通过make方式创建的切片对应的数组,是由make底层维护,对外不可见,即只能通过slice去访问各个元素
3.3 直接指定具体数组,使用原理类似make方式
func main() { var slice []string = []string{"jake", "tom", "marry"} }
3.4 切片可以继续切片
func main() { var slice []string = []string{"jake", "tom", "marry"} slice2 := slice[1:3] }
3.5 用append内置函数,可以对切片进行动态追加
func main() { var slice []string = []string{"jake", "tom", "marry"} slice = append(slice, "Lucy", "Lily") fmt.Printf("slice追加后=%v\n", slice) var slice2 []string = []string{"jake", "tom", "marry"} // 可以追加切片 slice = append(slice, slice2...) fmt.Printf("slice追加切片slice2后=%v\n", slice) }
输出:
slice追加后=[jake tom marry Lucy Lily] slice追加切片slice2后=[jake tom marry Lucy Lily jake tom marry]
切片append操作的原理分析:
a. go底层会创建一个新的数组newArr(安装扩容后大小)
b. 将slice原来包含的元素拷贝到新的数组newArr
c. slice重新引用到newArr
注意newArr是底层来维护的,程序员不可见。
3.6 使用copy内置函数来实现切片的拷贝操作
func main() { var slice []int = []int{1, 2, 3, 4, 5} slice2 := make([]int, 10) copy(slice2, slice) fmt.Printf("slice2=%v\n", slice2) }
4、string和slice
string底层是一个byte数组,本身是引用这个byte数组的切片 ,因此string也可以进行切片处理
func main() { str := "www.baidu.com" slice := str[10:] fmt.Printf("slice=%v\n", slice) }
string是不可变的,也就是说不能通过str[0]='z'方式来修改字符串
如果需要修改字符串,可以先将string->[]byte或者[]rune->修改后重新转成string