2016-04-19 9 views
9

はのは、私は長さ3のint型の次の配列があるとしましょう:Goでスライスの基本配列を取得するには?

nums := [3]int{1,2,3}

その後、私はちょうど最初の2つの項目numSliceとNUMSにcapを呼び出す

numSlice := nums[:2]

のスライスをつかみますいずれの場合も3をもたらし、lenはそれぞれ2および3を生じる。

そのスライス(numSlice = append(numSlice, 10))に追加すると、基本アレイ(nums)は[1 2 10]になります。 capは、スライスの基礎となる配列が同じで、スライスのlenが3になっているので、両方とも3のままです。

ただし、そのスライスにもう一度追加すると(numSlice = append(numSlice, 20))変更する必要があります - 今度はcapがnumSliceに倍増し、lenが4になった場合です。

ご迷惑をかけて申し訳ありませんが、自分自身を歩いていると申し訳ありませんが、基礎となる配列と新しい配列への参照を取得する方法は?

答えて

13

まず、まだお持ちでない場合は、this official blog post about slice internalsとお読みください。それはすべてをクリアするはずです。

基本アレイにアクセスするには、reflectunsafeの組み合わせを使用できます。特に、reflect.SliceHeaderには、スライスの基礎となる配列へのポインタを含むDataフィールドが含まれています。 unsafeパッケージのドキュメントから適応

例:

s := []int{1, 2, 3, 4} 
hdr := (*reflect.SliceHeader)(unsafe.Pointer(&s)) 
data := *(*[4]int)(unsafe.Pointer(hdr.Data)) 
+4

この記事はあまりにも便利です。http://blog.golang.org/slices 'Data'が指すない可能性があることは注目に値する – leeor

+2

バッキング配列の開始点:スライスの0番目の要素まで。したがって、 'numSlice:= nums [1:]'の場合、実際にはArrayの2番目の要素を指してしまうことになります。 [例](http://play.golang.org/p/8fCCz9d7rG) – djd

+0

おそらくばかげた質問として、これは何のパフォーマンスですか? – Highstead

関連する問題