Go实战(三)-数组array、切片slice语法详解(下)

2.1 创建切片

func main() {
   // 1.声明切片
   var s1 []int
   if s1 == nil {
      fmt.Println("是空")
   } else {
      fmt.Println("不是空")
   }
   
   // 2.:=
   s2 := []int{}
   
   // 3.make()
   var s3 []int = make([]int, 0)
   fmt.Println(s1, s2, s3)
   
   // 4.初始化赋值
   var s4 []int = make([]int, 0, 0)
   fmt.Println(s4)
   s5 := []int{1, 2, 3}
   fmt.Println(s5)
   
   // 5.从数组切片
   arr := [5]int{1, 2, 3, 4, 5}
   var s6 []int
   
   // 前包后不包
   s6 = arr[1:4]
   fmt.Println(s6)
}

切片初始化

// 全局:
var arr = [...]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
var slice0 []int = arr[start:end] 
var slice1 []int = arr[:end]        
var slice2 []int = arr[start:]        
var slice3 []int = arr[:] 
var slice4 = arr[:len(arr)-1]      //去掉切片的最后一个元素
// 局部:
arr2 := [...]int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0}
slice5 := arr[start:end]
slice6 := arr[:end]        
slice7 := arr[start:]     
slice8 := arr[:]  
slice9 := arr[:len(arr)-1] //去掉切片的最后一个元素

Reslice

arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7}
s := arr[2:]
s := arr[:]
s = s[:5]

扩展 slice

s1 因为是视图,所以即使本身不存在 s1[4],但还是能取得该值

arr := [...]int{0, 1, 2, 3, 4, 5, 6, 7}
fmt.Println("arr =", arr)
s1 = arr[2:6] // [2 3 4 5]  len(s1)=4, cap(s1)=6
s2 = s1[3:5] // [s1[3], s1[4]] 即[5 6], len(s2)=2, cap(s2)=3

但 slice 只能向后扩展,不能向前哦:s[i]不可以超越len(s),向后扩展不可以超越底层数组cap(s)

Go实战(三)-数组array、切片slice语法详解(下)

那 slice 到底怎么实现的呢?

Go实战(三)-数组array、切片slice语法详解(下)

append 切片追加

添加元素时如果超越cap,系统会重新分配更大的底层数组。

由于值传递的关系,必须接收append的返回值。

上一篇:String.format详解


下一篇:Javascript操作DOM常用API总结