2013-06-05 3 views
3

step 35 in the tour of Go 연습 문제가 있습니다.var가있는 변수와 var가없는 변수를 선언하는 경우의 차이점

여기처럼 내 코드가 어떻게 표시되는지를 보여줍니다 :

package main 

import "code.google.com/p/go-tour/pic" 

func Pic(dx, dy int) [][]uint8 { 
    var pic = make([][]uint8, dy) 
    for y := 0; y < dy; y++ { 
     pic[y] = make([]uint8, dx) 
     for x := 0; y < dx; x++ { 
      pic[y][x] = uint8(x*y) 
     } 
    } 
    return pic 
} 

이 솔루션을 찾고 때, 나는 완벽하게 작동 PeterSO's 코드를 발견

func main() { 
    pic.Show(Pic) 
} 

func Pic(dx, dy int) [][]uint8 { 
    pixels := make([][]uint8, dy) 
    for y := 0; y < dy; y++ { 
     pixels[y] = make([]uint8, dx) 
     for x := 0; x < dx; x++ { 
      pixels[y][x] = uint8(x * y) 
     } 
    } 
    return pixels 
} 

내가 볼 수있는 유일한 차이점, 난 것입니다 그의 코드는 := 지정을 사용하지만 var 키워드를 사용하여 pic 변수를 정의합니다. 자, 왜 내 코드가 작동하지 않습니까?

답변

2

:=을 사용하는 경우 기호 오른쪽에있는 식에서 변수 유형이 암시됩니다. =을 사용하는 경우 가정이 없으므로 유형을 직접 지정해야합니다.

이 경우

, 당신은 이런 식으로 작성해야 :

var pic [][]uint8 = make([][]uint8, dy) 

을하지만 실제로 더 나은 때문에 짧고 명확 :

pic := make([][]uint8, dy) 
+2

'var pic = make ([] [] uint8, dy)'가 유효하고 유형이 유추됩니다. 'var pic [] [] uint8 = make ([] [] uint8, dy)'를 쓰지 말고, 유형을 반복하는 것은 불필요합니다. – peterSO

+4

@Laurent : 타입 유추는'='뿐만 아니라'var v = expr'에서도 작동합니다. – zzzz

+1

또한, 함수 정의 밖에서': ='를 사용하여 전역 변수로 만들 수 없다고 생각하면,이 경우'var'을 사용해야합니다. – siritinga

5

당신은에

for x := 0; y < dx; x++ { 
    pic[y][x] = uint8(x * y) 
} 

을 썼다 구체적으로는 y < dx인데, 이는

panic: runtime error: index out of range 

나는 특히

for x := 0; x < dx; x++ { 
     pixels[y][x] = uint8(x * y) 
    } 

을 썼다 : x < dx. 따라서 yx으로 변경하십시오.

Variable declarations

변수 선언 변수를 생성

go tour slices

http://play.golang.org/p/UvGgszFhl-

package main 

import "code.google.com/p/go-tour/pic" 

func Pic(dx, dy int) [][]uint8 { 
    var pic = make([][]uint8, dy) 
    for y :=0; y < dy; y++ { 
     pic[y] = make([]uint8, dx) 
     for x :=0; x<dx; x++ { 
      pic[y][x] = uint8(x*y) 
     } 
    } 
    return pic 
} 

func main() { 
    pic.Show(Pic) 
} 

, 그것은 에 식별자를 결합하고, 그것을 입력 및 임의로 초기 값을 제공한다.

ShortVarDecl = IdentifierList ":=" ExpressionList :

VarDecl  = "var" (VarSpec | "(" { VarSpec ";" } ")") . 
VarSpec  = IdentifierList (Type [ "=" ExpressionList ] | "=" ExpressionList) . 

Short variable declarations

짧은 변수 선언

구문을 이용한다.

그것은 표현하지만 유형의 초기화와 일반 변수 선언을위한 속기 : 일반 변수 선언과 달리

"var" IdentifierList = ExpressionList . 

, 짧은 변수 선언은 재 선언 변수는 원래 이전 에서 선언 된 제공 할 수있다 동일한 유형의 동일한 블록과 공백이 아닌 변수 중 적어도 하나는 새로운 것입니다.

코드 var pic = make([][]uint8, dy) 및 짧은 양식 pic := make([][]uint8, dy) 모두에서 작동합니다.

관련 문제