2016-10-01 3 views
15

나는 학습 중이다. A Tour of Go을 통해 가라. 거기에있는 연습 중 하나는 dy 행의 2D 슬라이스와 uint8을 포함하는 dx 열을 생성하도록 요청합니다.이동 중에 2D 슬라이스를 만드는 가장 간단한 방법은 무엇입니까?

a:= make([][]uint8, dy)  // initialize a slice of dy slices 
for i:=0;i<dy;i++ { 
    a[i] = make([]uint8, dx) // initialize a slice of dx unit8 in each of dy slices 
} 

나는 각 조각을 반복하는 것은 너무 장황 초기화 할 수 있다고 생각 : 작동 나의 현재의 접근 방식은,이입니다. 슬라이스의 크기가 더 커지면 코드가 다루기 힘들어집니다. Go에서 2D (또는 n 차원) 슬라이스를 초기화하는 간결한 방법이 있습니까?

답변

25

이, 당신이 한 것은 "올바른"방법입니다; 슬라이스는 항상 1 차원이지만 더 높은 차원의 객체를 구성하기 위해 구성 될 수 있기 때문입니다. 자세한 내용은이 질문을 참조하십시오 : Go: How is two dimensional array's memory representation. 예를 들어,

a := make([][]uint8, dy) 
for i := range a { 
    a[i] = make([]uint8, dx) 
} 

은 또한 당신이 composite literal으로 슬라이스를 초기화하는 경우, 당신은 "무료"이를 얻을 수 있습니다 : 당신이 그것에 단순화 할 수

한 것은 for range 구조를 사용하는 것입니다

a := [][]uint8{ 
    {0, 1, 2, 3}, 
    {4, 5, 6, 7}, 
} 
fmt.Println(a) // Output is [[0 1 2 3] [4 5 6 7]] 

예, 이것은 당신이 모든 요소를 ​​열거 할 필요가 같은 겉보기에 한계가; 그러나 모든 트릭이 있습니다. 즉, 모든 값을 열거 할 필요는 없으며 슬라이스의 요소 유형이 zero values이 아닌 것들만 열거 할 수 있습니다. 자세한 내용은 Keyed items in golang array initialization을 참조하십시오.

첫 번째 10 개 요소가 제로가 조각을 원하고 12 다음 예를 들어

, 다음과 같이 만들 수 있습니다

b := []uint{10: 1, 2} 
fmt.Println(b) // Prints [0 0 0 0 0 0 0 0 0 0 1 2] 

이 또한주의 대신 arrays를 사용하려는 경우 그 slices, 그것은 쉽게 생성 될 수있다 :

c := [5][5]uint8{} 
fmt.Println(c) 

출력된다 :

[[0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0] [0 0 0 0 0]] 
배열의 경우

당신은 배열을 설명하지만 값이없는 한, "외부"배열을 반복하고 "내부"배열을 초기화 할 필요가 없습니다. 자세한 내용은 블로그 게시물 Arrays, slices (and strings): The mechanics of 'append'을 참조하십시오.

Go Playground의 예를보십시오. 나는 2 차원 배열의 행을 교환하기 위해이 기능을 작성했습니다

0

당신은이 코드 조각을 참조 할 수 있습니다 - 더 간결한 방법이 없다

package main 

import "fmt" 

func main() { 
    var row, col int 
    fmt.Print("enter rows cols: ") 
    fmt.Scan(&row, &col) 

    // allocate composed 2d array 
    a := make([][]int, row) 
    for i := range a { 
     a[i] = make([]int, col) 
    } 

    // array elements initialized to 0 
    fmt.Println("a[0][0] =", a[0][0]) 

    // assign 
    a[row-1][col-1] = 7 

    // retrieve 
    fmt.Printf("a[%d][%d] = %d\n", row-1, col-1, a[row-1][col-1]) 

    // remove only reference 
    a = nil 
    // memory allocated earlier with make can now be garbage collected. 
} 

Reference

+3

는'range' 게다가, 난은 영업 이익이 무엇을 요구의 차이와 예제 코드를보고 실패합니다. – eduncan911

-1

:

func lchange(l1 int, l2 int, a [][]float64) { 
    b := make([]float64, 1) 
    b = a[l1][:] 
    a[l1] = a[l2] 
    a[l2] = b 
} 
+0

이것은 질문과 관련이 없습니다. – hazrmard

관련 문제