2013-04-27 194 views

回答

7

大廈@Kevin伯克的回答,嚴格地說

a := [][]byte{{1, 2}, {3, 4}} 

是切片的slice。這在內部與數組的array完全不同。

Playground link

fmt.Println("Array of Arrays") 
a := [2][2]int{{0, 1}, {2, 3}} 
for i := 0; i < 2; i++ { 
    for j := 0; j < 2; j++ { 
     fmt.Printf("a[%d][%d] = %d at %p\n", i, j, a[i][j], &a[i][j]) 
    } 
} 

fmt.Println("Slice of Slices") 
b := [][]int{{0, 1}, {2, 3}} 
for i := 0; i < 2; i++ { 
    for j := 0; j < 2; j++ { 
     fmt.Printf("b[%d][%d] = %d at %p\n", i, j, b[i][j], &b[i][j]) 
    } 
} 

內部數組的數組是內存只是一個連續比特所以它是非常有效的,而切片的切片是更復雜的。每個子片可以是不同的大小,並分配在不同的地方。片頭佔用額外的RAM並使用額外的間接訪問。

例如creating 100,000 3x3 array of arrays用盡了5.03 MB的RAM,而creating 100,000 3x3 slices of slices用盡了13.79 MB的RAM。

一片切片更加靈活 - 每一行可以有不同的大小,但如果你只是想要一個2x2矩陣,那麼一組數組是一個更好的選擇。

另一個區別是切片是引用類型 - 如果您將切片傳遞給某個函數,則會更改函數中的原始切片。數組不是 - 如果你將一個函數傳遞給一個函數,你將會製作一個可能很慢的副本,或者可能是你想要的副本。如果你想修改它,然後傳遞一個指針。

Here is an example

func f1(a [2][2]int) { 
    fmt.Println("I'm a function modifying an array of arrays argument") 
    a[0][0] = 100 
} 

func f2(b [][]int) { 
    fmt.Println("I'm a function modifying an slice of slices argument") 
    b[0][0] = 100 
} 

func main() { 
    fmt.Println("Array of arrays") 
    a := [2][2]int{{0, 1}, {2, 3}} 
    fmt.Printf("Before %v\n", a) 
    f1(a) 
    fmt.Printf("After %v\n\n", a) 

    fmt.Println("Slice of slices") 
    b := [][]int{{0, 1}, {2, 3}} 
    fmt.Printf("Before %v\n", b) 
    f2(b) 
    fmt.Printf("After %v\n", b) 
} 

它打印

Array of arrays 
Before [[0 1] [2 3]] 
I'm a function modifying an array of arrays argument 
After [[0 1] [2 3]] 

Slice of slices 
Before [[0 1] [2 3]] 
I'm a function modifying an slice of slices argument 
After [[100 1] [2 3]] 

一般爲一分維的東西,片是幾乎總是比數組更好。然而,對於固定大小的多維數組,數組數組是更好的選擇。

6

使用嵌套括號:

a := [][]byte{{1, 2}, {3, 4}}