まあ、私は1つの全体的な解決策を見つけました。明らかに、structure of a sliceには、バッキングバイト配列へのポインタ、バッキングバイト配列の長さ、バッキングバイト配列の容量が含まれているようです。
私はバイト配列へのポインタだけに興味があるので、スライスの内部データの最初のメンバーが必要です。
Goのunsafe.Pointer
は、安全でないポインタにスライスをキャストしませんが、安全でないポインタとしてスライスへのポインタをキャストします。私が望む古いタイプのポインタに安全でないポインタをキャストすることができるので、それをポインタへのポインタにキャストして、スライスの内部データの最初のメンバーを回復することができます。
実例があります。私はuintptr
が欲しかったですが、どのポインタ型にでもキャストできました。
package main
import (
"fmt"
"unsafe"
)
func main() {
// Arbitrary size
n := 4
// Create a slice of the correct size
m := make([]int, n)
// Use convoluted indirection to cast the first few bytes of the slice
// to an unsafe uintptr
mPtr := *(*uintptr)(unsafe.Pointer(&m))
// Check it worked
m[0] = 987
// (we have to recast the uintptr to a *int to examine it)
fmt.Println(m[0], *(*int)(unsafe.Pointer(mPtr)))
}
あなたの代わりに*int
を望んでいた場合、あなたはmPtr := *(**int)(unsafe.Pointer(&m))
を行うことができますこれは、限りスライスは、この内部データ構造を維持して動作します。 Goの内部構造に依存しない、より堅牢なソリューションに私は間違いなくオープンしています。
華麗で、魅力的です。 'ptr:=&myslice [0]' – chowey