简体   繁体   中英

In Golang, why such Type Conversion causes Runtime Error: index out of range?

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!

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM