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。因此,将您的更改yx.

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 .

与常规变量声明不同,短变量声明可以重新声明变量,前提是它们最初是在同一块中以相同类型声明的,并且至少有一个非空白变量是新的。

在您的代码var pic = make([][]uint8, dy)和简短形式pic := make([][]uint8, dy)中都可以使用。

于 2013-06-05T04:29:48.993 回答
2

如果使用:=,则变量的类型从符号右侧的表达式中隐含。如果使用=,则不做任何假设,您需要自己指定类型。

在这种情况下,你应该这样写:

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

但这确实更好,因为更短且更清晰:

pic := make([][]uint8, dy)
于 2013-06-05T03:42:21.573 回答