我正在练习" A Tour of Go",我所在的页面是https://tour.golang.org/moretypes/15
以下是我的代码:
package main
import "golang.org/x/tour/pic"
func Pic(dx, dy int) [][]uint8 {
var ret [][]uint8;
var row []uint8;
for i:=uint8(0);i<uint8(dy);i++ {
row = []uint8 {}
for j:=uint8(0);j<uint8(dx);j++ {
row = append(row, i+j)
}
ret = append(ret, row)
}
return ret
}
func main() {
pic.Show(Pic)
}
当我运行这些代码时,控制台会抛出错误:
panic: runtime error: index out of range
goroutine 1 [running]:
panic(0x18b820, 0x1040a010)
/usr/local/go/src/runtime/panic.go:464 +0x700
golang.org/x/tour/pic.Show(0x1d7948, 0x104000e0)
/go/src/golang.org/x/tour/pic/pic.go:24 +0x540
main.main()
/tmp/sandbox969725880/main.go:19 +0x20
有没有人有任何想法为什么这个int-&gt; uint8类型转换会发生错误?谢谢!
答案 0 :(得分:4)
uint8的最大值为255(仅8位,最大值为2 ^ 8),但传入Pic的dx,dy的值可能大于(因为它们是int,可能是64位)。在转换为uint8期间,大于255的值可能会转换为0。如果dy为256并且它作为i转换为0,则外部for循环根本不执行,并且没有项被推入数组。随后,当“golang.org/x/tour/pic”中的任何机制在返回后尝试访问矩阵中的值时,看起来它正在生成“索引超出范围”错误,因为在字面上没有索引要访问的矩阵。
工作代码:
package main
import "golang.org/x/tour/pic"
func Pic(dx, dy int) [][]uint8 {
var ret [][]uint8
for i := 0; i < dy; i++ {
row := []uint8{}
for j := 0; j < dx; j++ {
row = append(row, uint8(i+j))
}
ret = append(ret, row)
}
return ret
}
func main() {
pic.Show(Pic)
}