在Golang中,为什么这样的类型转换导致运行时错误:索引超出范围?

时间:2016-04-01 05:25:24

标签: arrays memory go type-conversion

我正在练习" 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类型转换会发生错误?谢谢!

1 个答案:

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