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

时间:2022-06-01 17:04:22

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

我在做“Go之旅”的练习,我的页面是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!

有人知道为什么这个int->uint8类型转换会出现错误吗?谢谢!

1 个解决方案

#1


4  

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.

uint8马克斯价值255(只有8位,马克斯2 ^ 8)但dx,dy传入图片可以值大于(因为他们是int,可能64位)。在转换为uint8时,大于255的值可能被转换为0。如果dy是256,当我将它转换为0时,外部for循环根本不会执行,也不会向数组中插入任何项。随后,当任何在“golang.org/x/tour/pic”中的机制在返回后试图访问矩阵中的值时,它看起来就像生成了一个“超出范围的索引”,因为在矩阵中没有索引可以访问。

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

#1


4  

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.

uint8马克斯价值255(只有8位,马克斯2 ^ 8)但dx,dy传入图片可以值大于(因为他们是int,可能64位)。在转换为uint8时,大于255的值可能被转换为0。如果dy是256,当我将它转换为0时,外部for循环根本不会执行,也不会向数组中插入任何项。随后,当任何在“golang.org/x/tour/pic”中的机制在返回后试图访问矩阵中的值时,它看起来就像生成了一个“超出范围的索引”,因为在矩阵中没有索引可以访问。

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