1.切片声明及创建
声明一个切片int型的切片
var s []int
初始化一个长度为len,容量为cap的切片
s = make([]int,len,cap) cap可以省略,省略后cap等于len
也可以简洁的初始化
s:=make([]int ,len,cap)
还可以指定值的创建切片
s:=[]int{1,2,3,4}
指定索引值式的创建
s:=[]int{3:5} 索引下标为3的值为5
2.切片的相关操作
数组是值类型,切片和数组不一样,切片是引用类型,如果不想改变原来的切片进行操作,可以使用copy(新切片,原切片)复制一份。切片在底层是数组,包含三部分,ptr为指向开始的元素,len为切片的长度,cap为切片的容量。s[1:4]会得到索引为1,2,3的值,脚标是前包括,后不包括。切片可以向后扩展,不可以向前扩展,s[i]不可以超越len(s),向后扩展不可以超越底层数组cap(s)。
例子1:
func update(s []int,val int) {
s[0] = val
}
func main(){
var total = [...]int{0,1,2,3,4,5,6,7}
s1:=total[:]
fmt.Println("change before")
fmt.Println(s1)
update(s1,100)
fmt.Println("change after")
fmt.Println(s1)
}
以上会输出
change before
[0 1 2 3 4 5 6 7]
change after
[100 1 2 3 4 5 6 7]
例子2:以下会输出什么?
func main(){
var total = [...]int{0,1,2,3,4,5,6,7}
var s1 []int
s1=total[2:6]
fmt.Printf("s1 len=%d,cap=%d\n",len(s1),cap(s1))
s2:=s1[2:5]
fmt.Printf("s2 len=%d,cap=%d\n",len(s2),cap(s2))
fmt.Println(total)
fmt.Println(s1)
fmt.Println(s2)
}
输出以下内容
s1 len=4,cap=6
s2 len=3,cap=4
[0 1 2 3 4 5 6 7]
[2 3 4 5]
[4 5 6]
画图看一下
这个就涉及到切片的向后扩展, s2的末索引超过s1的末索引时而不会报错。s1和s2都指向底层的total数组。