dony113407 2016-04-01 05:25
浏览 58
已采纳

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

I was doing the exercise of "A Tour of Go", the page I was on is https://tour.golang.org/moretypes/15

And following is my code:

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

When I run these codes, the console throws an error:

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

Does anyone have any ideas why does the error occur for this int->uint8 type conversion?Thanks!

  • 写回答

1条回答 默认 最新

  • dsshsta97935 2016-04-01 06:06
    关注

    uint8 has a max value of 255 (only 8 bits, max 2^8) but dx, dy passed into Pic can have values greater than that (since they're int's, likely 64 bits). Values greater than 255 might get cast to 0 during conversion to uint8. If dy is 256 and it's cast to 0 as i, the outer for loop doesn't execute at all and no items get pushed into the array. Subsequently, when whatever mechanism in "golang.org/x/tour/pic" tries to access the values in the matrix after it's returned, it looks like it's generating an 'index out of range' error because there are literally no indexes in the matrix to access.

    Working code:

    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)
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大