切片是数组的一个引用,因此切片是引用类型,在进行传递时,遵守引用传递的机制
切片的长度是可以变化的,因此切片是一个可以动态变化数组
切片的内存空间存放三块内容,第一块是数组的地址,第二块是数组的长度,第三块是数组的容量
切片可以继续切片
append动态添加内容到切片,返回新创建的切片(底层数组也重新创建),如果是将一个切片追加到另一个切片 newSlice = append(slice, slice...)
遍历的两种方式:for,for-range
copy(a, b)完成切片复制操作,相互独立,互不影响 。长度不够时不会报错(len(a)<len(b)),只拷贝len(a)个元素
创建切片的三种方式:
1、定义一个切片,然后让切片去应用一个已创建好的数组
arr := [5]int{1, 3, 5, 7, 9} slice := arr[1:3] fmt.Println(slice)
2、通过make来创建切片
slice := make([]int, 5, 8) slice = []int{1, 3, 5, 7} fmt.Println(slice)
3、简写创建方式:
slice := []int{1, 3, 5, 7} fmt.Println(slice)
slice 与string:
a、string底层是byte数组,因此string也可以进行切片处理
b、string是不可变的,也就是说不能通过str[0] = 'a'方式来修改字符串
c、如果要修改字符串,可以先将string -> []byte 或者string -> []rune 修改重写成string
通过切片方式修改字符串内容
str := "hello world" str1 := []byte(str) str1[0] = 'H' str2 := string(str1) fmt.Println(str2)
str := "hello world" str1 := []rune(str) str1[0] = '我' str2 := string(str1) fmt.Println(str2)
总结:
通过make方式创建切片可以指定切片的大小和容量
如果没有给切片的各个元素赋值,那么就会使用默认值(0,“”, false)
通过make方式创建切片对应的数组是由make底层维护,对外不可见,即只能通过slice去访问各个元素
方式1和方式2的区别:
方式1是直接引用数组,这个数组是事先存在的,程序员是可见的
方式2是通过make来创建切片,make也会创建一个数组,是由切片在底层维护,程序员是看不见的