2013-04-27 2 views

답변

7

건물 엄격

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

말하기 @Kevin 버크의 대답에 슬라이스 slice입니다. 어레이의 array과 내부적으로 상당히 다른 것입니다. 슬라이스의 슬라이스가 더 복잡 반면 그것은 매우 효율적 있도록

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]) 
    } 
} 

Playground link

내부적 배열의 배열 메모리 바로 인접한 비트이다. 각 하위 슬라이스는 다른 크기 일 수 있으며 다른 위치에 할당됩니다. 슬라이스 헤더는 여분의 RAM을 사용하고 엑세스하기 위해 여분의 삽입을 사용합니다.

예를 들어 creating 100,000 3x3 array of arrays은 5.03MB의 RAM을 사용하지만 creating 100,000 3x3 slices of slices은 13.79MB의 RAM을 사용합니다.

슬라이스 조각은 훨씬 더 융통성이 있습니다. 각 행마다 크기가 다를 수 있지만 2x2 행렬을 원한다면 배열 배열을 선택하는 것이 훨씬 더 좋습니다.

또 다른 차이점은 슬라이스가 참조 유형이라는 것입니다. 슬라이스를 함수에 전달하면 함수의 원래 슬라이스가 변경됩니다. 배열은 그렇지 않습니다 - 하나를 함수에 전달하면 속도가 느려지거나 원하는 것을 복사 할 수 있습니다. 그것을 수정하려면 포인터를 전달하십시오. 한 차원 것들에 대한 일반적

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]] 

를 인쇄

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) 
} 

이 조각은 거의 항상 배열보다 낫다. 그러나 고정 된 크기의 다차원 배열의 경우 배열 배열이 더 나은 선택입니다.

6

를 사용하여 중첩 된 괄호 :

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