2017-01-07 2 views
1
package main 

import "fmt" 

type Point struct { 
     X int 
     Y int 
} 

type Points struct { 
    P []Point 
} 

func main() { 
    data := Points{} 
    for i := 0; i < 10; i++ { 
     data.P = append(data.P, Point{ 
      X: i, 
      Y: i*2, 
     }) 
    } 
    fmt.Printf("%+v\n", data.P[5:11]); 
} 

とパニックしない理由は、プリントアウト:golang:上記のプログラムが実行されている間、次のコードは、 "範囲外のスライスインデックス" エラー

[{X:5 Y:10}、{X {X:0 Y:0}]

{X:0 Y:0} 、Y:0}スライスの長さが10になると自動的に生成されるように見えますが、5:11を取得しようとしていますか?

私のような「生」のスライスと私のコードとテストで問題を発見した:最初のプログラムがない理由

panic: runtime error: slice bounds out of range 

goroutine 1 [running]: 
panic(0x47a8e0, 0xc42000a130) 
     /usr/local/go/src/runtime/panic.go:500 +0x1a1 
main.main() 
     /home/fxr/go/src/cmhwc/test2.go:7 +0x53 
exit status 2 

:この単純なプログラムはエラーが(予想通り)を生成

package main 

import "fmt" 

func main() { 
    v := []int{0,1,2,3,4,5,6,7,8,9} 
    fmt.Printf("%v\n", v[5:11]) 
} 

パニックではない?

+1

各状況でスライスの容量を表示すると、その理由が表示されます。 – JimB

答えて

1

append()を使用して新しい要素を追加する余地のないスライスに要素を追加すると、新しい要素を追加して容量を2倍にして、古い要素と追加する新しい要素をコピーします。それへの参照を返します。スライスシンタックスを使用して、スライスの見かけ上の端を越えた要素を求めるときは、長さはappendによって返された&で作成された配列に実際に適用されます。

2 
2 
4 
4 
8 
8 
8 
8 
16 
16 

fmt.Println(cap(data.P)) 

のようなものを生成する必要があります

@JimBはコメントで示唆したように、あなたはこの出来事を見て追記ループ内のすべての段階での容量を印刷する文を追加することができます

+0

それは正しいです。ありがとう! – xrfang

+0

@xrfang、よろしくお願いします! –

関連する問題