Golang中的Slice

What?

Slice(切片)可以看做是包含三个属性:

  • 指向数组的指针
  • 切片的长度
  • 切片的容量

使用[]来访问切片,len函数可以返回切片的长度,cap函数可以返回切片的容量。

How To Creat It?

s := make([]int, 10) // len(s) = 10, cap(s) = 10
or
s := []int{1, 2, 3, 4, 5} //len(s) = 5, cap(s) = 5
or 
var a [10]int
s := a[1:5] //len(s) = 4, cap(s) = 10, same as make([]int, 4, 10)

当数组a改变是,切片也会变。切片的操作也会影响数组

Some else!

append函数可以在slice后面加元素。这这时会为slice重新分配空间。如果之前是指向某个数组的,那么,append会使关系失效。

package main

import "fmt"

func main() {
    var a = [...]int{1,2,3,4,5}
    z := a[1:4]
    fmt.Println(a)//[1 2 3 4 5]
    fmt.Println(z)//[2 3 4]
    z[2] = 3
    fmt.Println(a)//[1 2 3 3 5]
    fmt.Println(z)//[2 3 3]
    z = append(z,6,7)
    fmt.Println(a)//[1 2 3 3 5]
    fmt.Println(z)//[2 3 3 6 7]
    a[0] = 10
    fmt.Println(a)//[10 2 3 3 5]
    fmt.Println(z)//[2 3 3 6 7]
    z[0] = 20
    fmt.Println(a)//[10 2 3 3 5]
    fmt.Println(z)//[20 3 3 6 7]
    s := a[0:3]
    z = append(z, s...)
    fmt.Println(z)//[20 3 3 6 7 10 2 3]
}