go切片(Slice)
Slice使用的几种方式
arr := [...]int{0,1,2,3,4,5,6,7}
fmt.Println( "arr[2:6] = ", arr[2:6]) //arr[2:6] = [2 3 4 5]
fmt.Println( "arr[:6] = ", arr[:6]) //arr[:6] = [0 1 2 3 4 5]
fmt.Println( "arr[2:] = ", arr[2:]) //arr[2:] = [2 3 4 5 6 7]
fmt.Println( "arr[:] = ", arr[:]) //arr[:] = [0 1 2 3 4 5 6 7]
注意
Slice本身没有数据,是对底层array的一个view
下方s[0]对应的是arr[2]
arr := [...]int{0,1,2,3,4,5,6,7}
s := arr[2:6]
s[0] = 10
fmt.Println(arr) //[0 1 10 3 4 5 6 7]
slice上建立slice
arr := [...]int{0,1,2,3,4,5,6,7}
s := arr[2:6] //[2 3 4 5]
s = s[:5] //[2 3 4 5 6]
s = s[2:] //[4 5 6]
slice可以向后扩展,不可以向前扩展
向后扩展不可以超越底层数组cap(s)
直接访问slice不可以超过切片长度
arr := [...]int{0,1,2,3,4,5,6,7}
s1 := arr[2:6] // [2 3 4 5]
s2 := s1[3:5] // [5 6]
cap
arr := [8]int{0,1,2,3,4,5,6,7}
fmt.Println("arr = ",arr)
s1 := arr[2:6] // [2 3 4 5]
s2 := s1[3:5] // [5 6]
fmt.Printf("s1=%v, len(s1)=%d, cap(s1)=%d\n", s1, len(s1), cap(s1))
fmt.Printf("s2=%v, len(s2)=%d, cap(s2)=%d", s2, len(s2), cap(s2))
上方例子输出结果如下
slice添加值
使用append往切片中添加值
添加元素时如果超过cap,系统会重新分配更大的底层数组
由于值传递的关系,必须接收append的返回值
arr := [8]int{0,1,2,3,4,5,6,7}
s := arr[2:6] // s = [2 3 4 5]
s1 := append(s, 4) // s1 = [2 3 4 5 4] arr = [0 1 2 3 4 5 4 7]
s2 := append(s1, 5)// s2 = [2 3 4 5 4 5] arr = [0 1 2 3 4 5 4 5]
//下面这行执行完后s3 view的数组不是arr
//因为长度已经超过了arr的长度,所以go会重新将arr复制一份,用于s3
s3 := append(s2, 6)// s3 = [2 3 4 5 4 5 6] arr = [0 1 2 3 4 5 4 5]
fmt.Println("s, s1, s2, s3",s,s1,s2,s3)
定义slice
var s []int
// s == nil
for i := 0; i < 100; i++ {
s = append( s, i)
}
fmt.Println( s) // [0 1 2 ......99]
创建切片
slice1 := make([]int, 10)
slice2 := make([]int, 10, 32)
fmt.Printf("slice1: value:%v, len:%d, cap:%d\n",slice1, len(slice1), cap(slice1))
fmt.Printf("slice2: value:%v, len:%d, cap:%d\n",slice2, len(slice2), cap(slice2))
结果如下:
copy slice
package main
import "fmt"
func main() {
var numbers []int
numbers = append(numbers,0,1,2,3,4)
printSlice(numbers)
numbers1 := make([]int, len(numbers), (cap(numbers)) * 2)
printSlice(numbers1)
copy(numbers1,numbers)
printSlice(numbers1)
}
func printSlice(x []int){
fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}
删除slice
func main() {
numbers := []int{0,1,2,3,4,5,6,7,8}
printSlice2(numbers)
//删除中间的元素5
numbers = append(numbers[:5], numbers[6:]...)//[0 1 2 3 4 6 7 8]
printSlice2(numbers)
//删除头部元素
numbers = numbers[1:];//[1 2 3 4 6 7 8]
printSlice2(numbers)
//删除尾部元素
numbers = numbers[:len(numbers)-1]//[ 1 2 3 4 6 7]
printSlice2(numbers)
}
func printSlice2(x []int){
fmt.Printf("len=%d cap=%d slice=%v\n",len(x),cap(x),x)
}