3

囲碁演習のツアーでステップ 35 に問題がありました。

私のコードは次のようになります。

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のコードを見つけました

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
}

私が見ることができる唯一の違いは、彼のコードが割り当てを使用しているのに対し、キーワードpicを使用して変数を定義していることです。では、なぜ私のコードが機能しないのでしょうか?var:=

4

2 に答える 2

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. したがって、 を に変更yしますx

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

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

ツアースライスに行く

変数宣言

変数宣言は、変数を作成し、それに識別子をバインドして、型とオプションで初期値を与えます。

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

短い変数宣言

短い変数宣言では、次の構文を使用します。

ShortVarDecl = IdentifierList ":=" ExpressionList.

これは、初期化式を使用するが型を使用しない通常の変数宣言の省略形です。

"var" IdentifierList = ExpressionList .

通常の変数宣言とは異なり、短い変数宣言は、同じブロック内で同じ型で最初に宣言されていて、空白以外の変数の少なくとも 1 つが新しい場合に、変数を再宣言できます。

コードvar pic = make([][]uint8, dy)と短い形式のpic := make([][]uint8, dy)両方で機能します。

于 2013-06-05T04:29:48.993 に答える