2016-04-01 1 views
2

私は「ゴーのA・ツアー」の運動をしていた、私が上にあったページがhttps://tour.golang.org/moretypes/15Golangでは、なぜそのような型変換によってランタイムエラーが発生するのですか?インデックスが範囲外ですか?

され、次は私のコードです:

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-> uint8型変換でエラーが発生するのはなぜですか?ありがとうございます!

答えて

4

uint8の最大値は255です(わずか8ビット、最大2^8)が、dx、Picに渡すdyはそれよりも大きな値を持つ可能性があります。 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) 
} 
関連する問題