在var中使用var vs without var声明变量之间的差异

big*_*ind 3 go indexoutofboundsexception

在Go练习中,我在第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
}
Run Code Online (Sandbox Code Playgroud)

在寻找解决方案时,我发现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
}
Run Code Online (Sandbox Code Playgroud)

我能看到的唯一区别是,我pic使用var关键字定义变量,而他的代码使用:=赋值.现在,为什么我的代码不起作用?

pet*_*rSO 5

你写了

for x := 0; y < dx; x++ {
    pic[y][x] = uint8(x * y)
}
Run Code Online (Sandbox Code Playgroud)

特别是:y < dx,这导致,

panic: runtime error: index out of range
Run Code Online (Sandbox Code Playgroud)

我写

    for x := 0; x < dx; x++ {
        pixels[y][x] = uint8(x * y)
    }
Run Code Online (Sandbox Code Playgroud)

特别是: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)
}
Run Code Online (Sandbox Code Playgroud)

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

去游览切片

变量声明

变量声明创建一个变量,将标识符绑定到它并为其提供一个类型和可选的初始值.

VarDecl     = "var" ( VarSpec | "(" { VarSpec ";" } ")" ) .
VarSpec     = IdentifierList ( Type [ "=" ExpressionList ] | "=" ExpressionList ) .
Run Code Online (Sandbox Code Playgroud)

简短的变量声明

短变量声明使用以下语法:

ShortVarDecl = IdentifierList ":=" ExpressionList .

它是带有初始化表达式的常规变量声明的简写,但没有类型:

"var" IdentifierList = ExpressionList .
Run Code Online (Sandbox Code Playgroud)

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

在您的代码var pic = make([][]uint8, dy)和简短形式pic := make([][]uint8, dy)都将工作.