slice与array的差异。
类型的差异
array属于值类型,同属于值类型的包含,基础数据类型、结构体类型。
slice属于引用类型,而同属于引用类型的包含,字典、通道、函数类型。
宣告方式
从下面的範例看,宣告方式的差异。
package mainimport "fmt"func main() { //array 宣告, string 类型 a := [5]string{"A","B","C","D","E"} fmt.Printf("The value of a: %s\n\n", a) //slice 宣告, 不指名容量, 容量就跟长度相同 s1 := make([]int, 5) fmt.Printf("The length of s1: %d\n", len(s1)) fmt.Printf("The capacity of s1: %d\n", cap(s1)) fmt.Printf("The value of s1: %d\n\n", s1) //slice 宣告, 用len、cap可以取得slice的length、capacity s2 := make([]int, 5, 5) fmt.Printf("The length of s2: %d\n", len(s2)) fmt.Printf("The capacity of s2: %d\n", cap(s2)) fmt.Printf("The value of s2: %d\n\n", s2)}
https://play.golang.org/p/KWEYeVjvQML
array在宣告时,就确定长度。
a := [5]string{"A","B","C","D","E"}
slice 包含三个部分,pointer、length、capacity。
借用网路上的图片,来说明slice的结构。
可以把slice看做对array的ㄧ层简单的封装。
s2 := make([]int, 5, 5)
解读上面的宣告,宣告一个 slice,pointer 指向一个int array,而这个int array的长度和容量都是5。
s2 := make([]int, 5, 8)
更改成这个宣告的话,宣告一个 slice,pointer 指向一个int array,而这个int array的长度是5,容量是8。
添加元素到slice中package mainimport "fmt"func main() { s1 := make([]int, 0) fmt.Printf("The capacity of s1: %d\n", cap(s1)) for i := 1; i <= 5; i++ { s1 = append(s1, i) fmt.Printf("s1(%d): len: %d, cap: %d\n", i, len(s1), cap(s1)) } fmt.Println()}
https://play.golang.org/p/KlzlLlMkbj2
使用append的函数,把元素丢到slice s1中。
当容量为零时,append会新增一个容量。
当容量不够时,append会以2的倍数增加slice的容量。
小总结:
array在宣告的时候,就确定长度,且长度固定。
slice的长度,可以随着元素的数量增加而增长。
引用:
https://hsinyu.gitbooks.io/golang_note/content/slice.html