1. 程式人生 > >golang中Array與Slice

golang中Array與Slice

range make imp 形參 隱式 amp [] 報錯 同時

在golang中有數組和Slice兩種數據結構,Slice是基於數組的實現,是長度動態不固定的數據結構,本質上是一個對數組字序列的引用,提供了對數組的輕量級訪問。那麽在go的函數中以數組或Slice為形參的時候就存在一些差別。

? 首先,golang中是值傳遞,並且如果傳遞的參數是數組的時候並不會隱式將數組作為引用或者指針傳入,而是傳入副本,而如果想輕量級傳遞數據,這個時候就需要使用slice了。

可以通過一個簡單的例子來驗證這個機制:

package main

import "fmt"

func main()  {
    array := [4]int{1, 2, 3, 4}
    fmt.Printf("實參array地址:%p\n", &array)
    printArray(array)
    printSlice(array[0:4])
}

func printArray(array [4]int)  {
    fmt.Printf("形參array地址:%p\n", &array)
    for _, e := range array {
        fmt.Print(e)
    }
    fmt.Println()
}

func printSlice(array []int)  {
    fmt.Printf("形參slice地址:%p\n", &array)
    for _, e := range array {
        fmt.Print(e)
    }
    fmt.Println()
}

運行結果如下:

實參array地址:0xc0000480a0
形參array地址:0xc0000480e0
1234
形參slice地址:0xc000044420
1234

運行結果表明,如果形參是數組的話,那麽相當於傳遞的是一份數組的拷貝,形參和實參的地址均相同,而如果形參是slice的話,傳遞的則是引用而不是拷貝。

同時,如果形參是數組,那麽Slice變量是無法傳入的,反之亦然。

另外,數組的幾種定義方式也有區別:

例如[...]int{1,2,3,4}這是一個數組,能夠printArray([...]int{1,2,3})printSlice([...]int{1,2,3}[0:1]) 這兩種方式使用,而[]int{}則實際上是一個slice,所以可以printSlice([]int{})

,但是如果printArray([]int{})則編譯器會報錯。所以定義數組的時候如果指定了長度或者[...]int{1,2,3}這種自動初始化長度的情況則返回的是數組,而如果沒有指定長度則返回的是slice。

結論:如果要傳遞拷貝則使用數組作為形參,如果要傳遞引用則使用slice作為形參。定義數組需要指定長度,定義slice不能指定長度(或者使用make定義)。

golang中Array與Slice