2011-08-16 10 views
2

は容量がエラー以下これを実行しようとした長さ容量より大きいスライス長でランタイムエラーが発生するのはなぜですか?

 

    package main 

    import fmt "fmt" 

    func main(){ 

    type b []int 
    var k = make([]b, 10, 5) 
    fmt.Printf("%d\n",k[8]) 
    } 

与える未満のスライスを作りました。

 

    panic: runtime error: makeslice: cap out of range 

    runtime.panic+0x9e /go/src/pkg/runtime/proc.c:1060 
      runtime.panic(0x453b00, 0x30020390) 
    runtime.panicstring+0x94 /go/src/pkg/runtime/runtime.c:116 
      runtime.panicstring(0x4afd6c, 0x40d80c) 
    runtime.makeslice+0x70 /go/src/pkg/runtime/slice.c:24 
      runtime.makeslice(0x44302c, 0xa, 0x0, 0x5, 0x0, ...) 
    main.main+0x45 C:/GOEXCE~1/basics/DATATY~1/slice.go:8 
      main.main() 
    runtime.mainstart+0xf 386/asm.s:93 
      runtime.mainstart() 
    runtime.goexit /go/src/pkg/runtime/proc.c:178 
      runtime.goexit() 
    ----- goroutine created by ----- 
    _rt0_386+0xbf 386/asm.s:80 

私の質問は、容量が長さよりも短いことができますか?

「はい」の場合、このエラーが発生した理由は?
「これはランタイムエラーで、なぜコンパイル時ではないのですか?

答えて

12

いいえ、容量は長さより小さくすることはできません。

スライスは配列の一部への参照です。スライスの容量は、バッキングアレイのサイズを表します。その長さが容量よりも大きい場合は、どのメモリを使用していますか?

次不変は常にスライスS(あなたが安全ではない何かをやった場合を除く)についても当てはまる:

0 <= len(s) <= cap(s) 

誤差は常に検出することができないので、あなたのコードは、実行時エラーではなくコンパイル時エラーを生成します静的に。あなたの場合、それは可能かもしれませんが、このコードを考えてみてください:

package main 

import (
    "fmt" 
    "rand" 
) 

func main() { 
    k := make([]int, rand.Int(), rand.Int()) 
    fmt.Println(k) 
} 

実行時まで値を渡すことはできません。

関連する問題