一.向lslice中添加元素(apend)
arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7}
s1 := arr[2:6]
fmt.Println("s1=", s1)
s2 := s1[3:5]
fmt.Println("s2=", s2)
s3 := append(s2, 10)
fmt.Println("s3=", s3)
s4 := append(s3, 11)
fmt.Println("s4=", s4)
s5 := append(s4, 12)
fmt.Println("s5=", s5)
fmt.Println("arr=", arr)
结果:
分析:
s1结果没有问题,s2结果是因为slice扩展的原理。
s3结果将arr数组最后一位7替换为10。
s4和s5虽然已经添加了11、12,但是超过了数组长度,系统会分配一个更长的数组添加11、12。
因此:
1.添加元素时如果超越了cap,系统会重新分配更大的底层数组;
2.由于值传递的关系,必须接受append的返回值;s=append(s,val)
二.slice的创建
var s []int//创建slice,初始值为nil,s=nil
新创建的slice初始值为nil(nil就是null,只不过在go中时nil)。
初始化len和cap的创建
func printSlice(s []int) {
fmt.Printf("len=%d,cap=%d\n", len(s), cap(s))
}
func main() {
s1 := []int{2, 4, 6, 8} //len和cap为4,注意和数组初始化区别,数组初始化必须指定大小
printSlice(s1)
s2 := make([]int, 16) //创建slice,len和cap为16
printSlice(s2)
s3 := make([]int, 10, 32) //创建slice,len为10,cap为32
printSlice(s3)
}
结果:
三.向slice中添加元素
var s []int //创建slice,初始值为nil,s=nil
for i := 0; i < 100; i++ {
s = append(s, i)//添加
}
fmt.Println(s)
结果:
四.向slice中添加元素,len和cap变化
func printSlice(s []int) {
fmt.Printf("len=%d,cap=%d\n", len(s), cap(s))
}
func main() {
var s []int //创建slice,初始值为nil,s=nil
for i := 0; i < 20; i++ {
printSlice(s)
s = append(s, i)
}
fmt.Println(s)
}
结果:len每次+1变换,cap每次是以2的平方扩充。
五.复制函数copy使用
s1 := []int{2, 4, 6, 8} //注意和数组初始化区别,数组初始化必须指定大小
s2 := make([]int, 16) //创建slice,len和cap为16
copy(s2, s1)//copy使用
fmt.Println(s2)
结果:
六.删除切片中间的元素
Go语言中没有自带的delete函数,但是可以使用切片本身性质左开右闭和append()函数实现。
注意:append(s,a)这里的a必须是常量,但是后面添加切片,需要添加“…”。
s1 := []int{2, 4, 6, 8} //注意和数组初始化区别,数组初始化必须指定大小
s2 := make([]int, 16) //创建slice,len和cap为16
copy(s2, s1)
fmt.Println(s2)
printSlice(s2)
s2 = append(s2[:3], s2[4:]...)
fmt.Println(s2)
printSlice(s2)
结果:
七.删除切片首元素和尾元素
s1 := []int{2, 4, 6, 8} //注意和数组初始化区别,数组初始化必须指定大小
s2 := make([]int, 16) //创建slice,len和cap为16
copy(s2, s1)
fmt.Println(s2)
printSlice(”s2=“s2)
fmt.Println("删除首元素")
font := s2[0] //用于接收首元素
s2 = s2[1:]
fmt.Println("首元素", font, ",去除首元素后s2=", s2)
printSlice(s2)
fmt.Println("删除尾元素")
tail := s2[len(s2)-1] //用于接收尾元素
s2 = s2[:len(s2)-1]
fmt.Println("尾元素", tail, ",去除尾元素后s2=", s2)
printSlice(s2)
结果: