[Golang]slice介绍与心智图

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的ㄧ层简单的封装。
http://img2.58codes.com/2024/20131728eJ0YxiCqDo.png

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的长度,可以随着元素的数量增加而增长。

http://img2.58codes.com/2024/2013172877zzusuCCK.png

引用:

https://hsinyu.gitbooks.io/golang_note/content/slice.html


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章