big*_*ind 3 go indexoutofboundsexception
这是我的代码的样子:
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关键字定义变量,而他的代码使用:=赋值.现在,为什么我的代码不起作用?
你写了
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.因此,改变你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)
}
Run Code Online (Sandbox Code Playgroud)
http://play.golang.org/p/UvGgszFhl-

变量声明创建一个变量,将标识符绑定到它并为其提供一个类型和可选的初始值.
Run Code Online (Sandbox Code Playgroud)VarDecl = "var" ( VarSpec | "(" { VarSpec ";" } ")" ) . VarSpec = IdentifierList ( Type [ "=" ExpressionList ] | "=" ExpressionList ) .短变量声明使用以下语法:
ShortVarDecl = IdentifierList ":=" ExpressionList.它是带有初始化表达式的常规变量声明的简写,但没有类型:
Run Code Online (Sandbox Code Playgroud)"var" IdentifierList = ExpressionList .与常规变量声明不同,短变量声明可以重新声明变量,前提是它们最初在具有相同类型的同一块中最初声明,并且至少有一个非空变量是新的.
在您的代码var pic = make([][]uint8, dy)和简短形式pic := make([][]uint8, dy)都将工作.
| 归档时间: |
|
| 查看次数: |
1401 次 |
| 最近记录: |