slice与array的差异。
类型的差异
array属於值类型,同属於值类型的包含,基础数据类型、结构体类型。
slice属於引用类型,而同属於引用类型的包含,字典、通道、函数类型。
宣告方式
从下面的范例看,宣告方式的差异。
package main
import "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。
package main
import "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的长度,可以随着元素的数量增加而增长。
引用:
>>: 第 52 篇 - 研究 shell 解释器 - 居然可以支援 function
昨天我们利用service把计算sign的逻辑串接起来,今天继续来试试看,要如何取得永丰Api的re...
昨天我们快乐 (?) 的把资料 render 到网页上(虽然会有点 Delay,对 UX 不好…不过...
介绍Unity资源商店 先开启Asset Store,将Assets Store拖曳出来 对着As...
这是 Roblox 从零开始系列,入门章节的第十个单元,在这个单元你将学会如何去为陷阱加上执行确认,...
上篇加入了支持中文的字体,这边使用matplotlib.pyplot与资料库资料生成表格 生成表格 ...