创建切片

  1. package main
  2. import "fmt"
  3. func main () {
  4. var s = make([] int, 1) // length 必须指定, capacity 无需指定。
  5. fmt.Println(s, len(s),cap(s)) // 输出 length 与 capacity 的值
  6. s = [] int {1,2,3,4} // 多个赋值
  7. fmt.Println(s, len(s),cap(s))
  8. s = append(s, 5) // 通过 append() 为 slice 添加值
  9. fmt.Println(s,len(s),cap(s))
  10. }
  1. [0] 1 1 // length 被指定为 1 ,capacity 初始等于 length
  2. [1 2 3 4] 4 4 // 赋值之后 length 自动变成了 4 ,capacity 也变成了 4
  3. [1 2 3 4 5] 5 8 // 增加一个元素后 length 变成 5,capacity*2 ,当 length=capacity 时 capacity*2。

切片模型

slice (2).svg

切片的长度不会超过切片的容量所以:0 <= len(s) <= cap(s)
当 length=capacity 时,capacity 以 capacity *2 的速度增长,若 slice 超过1k 字节 ,capacity 以1.5增长。

切片索引

  1. package main
  2. import "fmt"
  3. func main () {
  4. var k = make([] string, 0) //空切片
  5. fmt.Println(k, len(k), cap(k))
  6. k = [] string {"g", "o", "l", "a", "n", "g"}
  7. fmt.Println(k[2:4])
  8. }
  1. [] 0 0 // length:0 capacity:0
  2. [l a] // k[:end-1]

由于切片指向一个底层数组,切片的索引表达式为 slice[start:end]。
其中 arr[0]=slice[0]=slice[start],但在输出时为 end-1 。若写成 k[ : ] 则表示从开 start 到 end。

切片共用底层数组

  1. package main
  2. import "fmt"
  3. func main() {
  4. Slice := [] int {1, 2, 3, 4, 5, 6, 7}
  5. newSlice := Slice[1:3]
  6. newSlice[0] = 10
  7. fmt.Println(newSlice)
  8. fmt.Println(Slice)
  9. }
  1. [10 3] // 底层数组被改变了
  2. [1 10 3 4 5 6 7]