切片
-本身并不是数组,它指向底层的数组
-作为变长数组的替代方案,可以关联底层数组的局部或全部
-为引用类型
-使用len()获取元素的个数,cap()获取容量
-一般使用make()创建
-如果多个slice指向相同底层数组,其中一个的值改变会影响全部
-make([]T,len,cap)
-其中cap 可以省略,则和len的值相同
package main
import "fmt"
func main(){
var s1[10]int
s1:=[10]int{1,2,3,4,5,6,7,8,9}
fmt.Println(s1)
s2 :=s1[:9]
s3 :=s1[4:8] //包含开始不包含结束
fmt.Println(s2)
}
使用make声明数组
s1 :=make([]int,3,9)
package main
import "fmt"
func main(){
s1 :=make([]int,3,10)
fmt.Println(s1)
}
--从一个slice取出一个新的slice
Reslice:从一个slice取出一个新的slice
Reslice时索引被slice的切片为准
索引不可以超过被slice的切片的容量cap()值
索引越界不会导致底层数组的重新分配而是引发错误
Append
可以在slice尾部追加元素
可以将一个slice追加在另一个slice尾部
如果最终未超过追加到slice的容量则返回原始slice//内存地址没有改变
如果超过追加到的slice的容量则将重新分配数组并拷贝原始数据//重新分配内存地址
package main
import "fmt"
func main(){
s1 :=make([]int,3,6)
fmt.Println("%v %p\n",s1,s1)
s1=append(s1,1,2)
fmt.Println("%v %p\n",s1,s1)
}
Copy
package main
import "fmt"
func main(){
s1 :=[]int{1,2,3,4,5,6,7}
s2 :=[]int{7,8,9}
copy(s1,s2) //s2的内容拷贝到s1中去,短的数组拷贝到长的数组,改变长的几个
fmt.Println(s1)
}
package main
import "fmt"
func main(){
s1 :=[]int{1,2,3,4,5,6,7}
s2 :=[]int{7,8,9}
copy(s2,s1) //长的数组拷贝到短的数组中去,只会匹配短的个数长度
fmt.Println(s2)
}
package main
import "fmt"
func main(){
s1 :=[]int{1,2,3,4,5,6,7}
s2 :=[]int{7,8,9}
copy(s2[2:2],s1[1:3])//拷贝到s2的指定并覆盖原有的数据
fmt.Println(s2)
}
package main
import "fmt"
func main(){
s1 :=[]int{1,2,3,4,5,6,7,1,1,1}
s2 :=[]int{7,8,9,11,22,33,44,55,66,77,88}
copy(s2[10:],s1[1:3])//拷贝到s2的指定并覆盖原有的数据.若复制的值超过被复制的数组,只会留下部分复制的数据,s1的值只会在s2留下一个
fmt.Println(s2)
fmt.Println(s1[1:3])
}