go slice和數組的區別

1.使用方式java

數組和slice長的很像,操做方式也都差很少,而且slice包含了數組的基本的操做方式,以下標、range循環,還有一些如len()則是多種類型共用,因此根據操做根本搞不清數組和切片的區別,可以看出區別的地方主要看如何聲明的。數組

數組的聲明方式很單一,一般就是下面這樣:app

array1 := [5]int{1, 2, 3, 4, 5}
array2 := [5]int{}

slice的聲明方式就很是多樣了,如前面介紹的幾種:函數

var slice1 = []int{1, 2, 3, 4, 5}
var slice2 = make([]int, 0, 5)
var slice3 = make([]int, 5, 5)
var slice4 = make([]int, 5)

加上對數組的切片和append操做都會產生數組切片(slice)spa

2.值傳遞or引用傳遞.net

func arrayModify(array [5]int) {
    newArray := array
    newArray[0] = 88
}
func sliceModify(slice []int) {
    newSlice := slice
    newSlice[0] = 88
}
func main() {
    array := [5]int{1, 2, 3, 4, 5}
    slice := []int{1, 2, 3, 4, 5}
    arrayModify(array)
    sliceModify(slice)
    fmt.Println(array)
    fmt.Println(slice)
}

輸出指針

[1 2 3 4 5]
[88 2 3 4 5]

其實不僅是數組,go語言中的大多數類型在函數中看成參數傳遞都是值語義的。也就是任何值語義的一種類型看成參數傳遞到調用的函數中,都會通過一次內容的copy,從一個方法棧中copy到另外一個方法棧。這對於熟練java的同窗須要進行一次完全的觀念轉變,在java中除了少數的值類型是按照值傳遞,全部的類在函數傳遞時都是具備引用語義的,也就是經過指針傳遞。因此在使用時傳遞對象,不須要去分別值和引用。code

go說到底不是一種純粹的面向對象的語言,更多的是一種更簡單高效的C,因此在參數傳遞上跟C保持着基本的一致性。一些較大的數據類型,好比結構體、數組等,最好使用傳遞指針的方式,這樣就能避免在函數傳遞時對數據的copy。對象

雖然slice在傳遞時是按照引用語義傳遞,可是又由於append()操做的問題,致使即便是引用傳遞仍是不能順利解決一些問題,後面一篇文章將說明一下如何解決遞歸函數中傳遞slice的問題:blog

 

go遞歸函數如何傳遞數組切片slice

相關文章
相關標籤/搜索