Go語言中數(shù)組是具有固定長度的相同數(shù)據(jù)類型元素的序列。而slice的長度可變撞羽。個人理解,類似C++中數(shù)組和vector的區(qū)別衫冻。
1. 數(shù)組
1.1 初始化
var a1 [3]int //3個整數(shù)型的數(shù)組诀紊,初始值是3個0
a2 := [5]int{1,2,3} //長度為5,后兩位是0
var a3 = [...]int{6, 7, 8} //不聲明長度
a4 := [...] int {1,2,3} //不聲明長度
a5 := [...] int {3:1} //長度為3的數(shù)組隅俘,只有最后一個是1邻奠,其他都是0
總之,初始化方式有四種为居,二二組合:是否指定長度X初始化部分碌宴、全部元素。
1.2 類型
package main
import (
"fmt"
"reflect"
)
func main() {
s1 := [5]int{1, 2, 3} // 這么寫就是數(shù)組類型,后兩位是0
fmt.Println("type:", reflect.TypeOf(s2))
}
結果:
type: [5]int
可以看到[5]int是一個完整的類型蒙畴。[4]int和[5]int是不同的類型贰镣。
1.3 參數(shù)傳遞
數(shù)組長度是類型的一部分,因此膳凝,函數(shù)聲明時變量類型里數(shù)組長度是不可缺少的碑隆。數(shù)組的傳遞是值傳遞的。在被調用函數(shù)內部修改數(shù)組蹬音,不影響調用方的數(shù)組的值上煤。
package main
import "fmt"
func modify_slice(s [5]int) {
s[0] = 10
fmt.Println("In modify_slice, slice values is:", s)
}
func main() {
s := [5]int{1,2,3,4,5}
modify_slice(s)
fmt.Println("In main, slice values is:",s)
}
輸出:
In modify_slice, slice values is: [10 2 3 4 5]
In main, slice values is: [1 2 3 4 5]
2. slice
2.1 初始化
slice的初始化,可以通過截取數(shù)組或slice著淆,或者使用make劫狠。
s1 := []int{1, 2, 3} //在內存中構建一個包括有3個元素的數(shù)組,然后將這個數(shù)組的引用賦值給s這個Slice
a := [5]int{1, 2, 3, 4, 5} //a是數(shù)組
s2 := a[1:4] //從數(shù)組中切片構建Slice
s3 := make([]int, 10, 20) //make函數(shù)初始化,len=10,cap=20
2.2 類型
package main
import (
"fmt"
"reflect"
)
func main() {
s2 := []int{1, 2, 3}
fmt.Println("type:", reflect.TypeOf(s2))
}
輸出:
type: []int
2.3 參數(shù)傳遞
slice的參數(shù)傳遞是引用傳遞永部,在被調用函數(shù)修改元素的值独泞,同時也是在修改調用方的slice的元素。
package main
import "fmt"
func modify_slice(s []int) {
s[0] = 10
fmt.Println("In modify_slice, slice values is:", s)
}
func main() {
s := []int{1,2,3,4,5}
modify_slice(s)
fmt.Println("In main, slice values is:",s)
}
輸出:
In modify_slice, slice values is: [10 2 3 4 5]
In main, slice values is: [10 2 3 4 5]
2.3 slice的len和cap
在追加元素時扬舒,如果容量cap不足時阐肤,cap一般變?yōu)樵瓉淼?倍來實現(xiàn)擴容
2.4 用slice截取數(shù)組
用slice截取數(shù)組時,修改slice會影響到數(shù)組讲坎。因為slice就是對原數(shù)組某一段的引用。
package main
import (
"fmt"
)
func main() {
a := [6]int{1, 2, 3, 4, 5}
s := a[1:3]
fmt.Println("before, arr is:", a)
s[1] = 10
fmt.Println("after, arr is:", a)
}
輸出:
before, arr is: [1 2 3 4 5 0]
after, arr is: [1 2 10 4 5 0]