Golang的數(shù)據(jù)聲明格式如下
data := [7]int{}
data:=[3]int{1, 2, 3}
data := [...]int{1, 2, 3}
我們注意到当娱,與其他語言不同的是數(shù)組的大小放在前面友鼻。
Go 語言的數(shù)組當做參數(shù)時叛本,是值傳遞颠毙,即會copy數(shù)組中的所有數(shù)據(jù)副瀑。
所以在實際的go語言開發(fā)中其實很少使用數(shù)組舱污,而是使用slice.
所以下面我們重點介紹一下slice
data := []int{}
data := []int{1,2, 3}
slice的聲明和array類似,只是省略了大小或者'...'
當slice的空間不足時粱栖,它就會自動將存儲空間增加一倍话浇。
可以用len(data)獲取slice中數(shù)據(jù)的長度,用cap(data)獲取slice的容量(capacity).
func printSlice(data []int){
for _, ele := range data{
fmt.Print(ele, " ")
}
fmt.Println()
}
func main(){
data := []int{1,2,3,4}
printSlice(data)
fmt.Printf("Capacity: %d, Length: %d\n", cap(data), len(data))
data = append(data, 10)
printSlice(data)
fmt.Printf("Capacity: %d, Length: %d\n", cap(data), len(data))
}
------------------------------------------
//result
1 2 3 4
Capacity: 4, Length: 4
1 2 3 4 10
Capacity: 8, Length: 5
上述代碼生聲明一個slice, 初始容量和數(shù)據(jù)長度都是4查排,然后通過append在slice后面動態(tài)添加了一個數(shù)據(jù)10凳枝, 此時由于容量已經(jīng)等于已有數(shù)據(jù)長度,即slice已滿跋核,所以需要動態(tài)擴容,go擴容方案是直接在原來的基礎上加倍叛买, 所以我們看到長度增加了1砂代,但是容量增加了4
所以這里需要注意的就是,如果slice容量已經(jīng)很多率挣,且滿了刻伊。那么此時添加一條記錄的代價將是非常高的。
我們也可以通過make函數(shù)來生成slice. 通過make函數(shù)還可以指定slice的初始大小
data := make([]byte, 5)
*說到make,這里我們提一下go語言的內(nèi)存分配椒功, go 有兩個內(nèi)建函數(shù)來分配內(nèi)存捶箱,new 和make. 兩者的區(qū)別是,new只是分配存儲空間动漾,make則主要用于slice, map, channel的初始化
copy() 函數(shù)
copy(dst, src): copy函數(shù)將src slice的數(shù)據(jù)拷貝到dst slice里面
其中丁屎,
- dst, src必須是slice, 如果是array,則必須通過array[0:] 轉(zhuǎn)換成slice
- copy時旱眯,src數(shù)據(jù)會覆蓋dst里面原來的數(shù)據(jù)晨川, 如果src數(shù)據(jù)量小于dst數(shù)據(jù)量证九,那么dst里面會有一部分數(shù)據(jù)不被覆蓋;如果src數(shù)據(jù)量大于dst,那么將只copy dst.length長度的src數(shù)據(jù)
我們通過下面的實例來體會一下
package main
import "fmt"
func main(){
a6 := []int{1,2,3,4,5,6}
a4 := []int{-1,-2,-3,-4}
fmt.Println("a6:", a6)
fmt.Println("a4:", a4)
copy(a6, a4)
fmt.Println("copy a4 to a6, ", a6)
fmt.Println()
a6 = []int{1,2,3,4,5,6}
a4 = []int{-1,-2,-3,-4}
copy(a4, a6)
fmt.Println("copy a6 to a4, ", a4)
fmt.Println()
array5 := [5]int{5,-5,5,-5,5}
s7 := []int{7,7,7,7,7,7,7}
fmt.Println("array5 ", array5)
fmt.Println("s7 ", s7)
copy(array5[0:], s7)
fmt.Println("copy s7 to array5 ", array5)
}
--------------------------------------------
//result
a4: [-1 -2 -3 -4]
copy a4 to a6, [-1 -2 -3 -4 5 6]
copy a6 to a4, [1 2 3 4]
array5 [5 -5 5 -5 5]
s7 [7 7 7 7 7 7 7]
copy s7 to array5 [7 7 7 7 7]