2017-12-29 8 views
0

私は、低レベルのプロジェクトにはGoを使い、データをコピーしないようにしたいと思います。構造体のポインタで[]バイトをキャストする方法は?

私は、固定サイズの構造体を持っている:バイトのスライスが何をコピーせずに、構造体であるかのように

type myStruct struct { 
    a uint8 
    b uint8 
} 

私は値を読み取るために、このslice of bytespointer of my structをキャストしたいと思います。 Cでは

data := []byte{69,0} 

var obj *myStruct 

//something like: 
obj = myStruct(data) 
// or 
obj = &myStruct(data) 

それは次のようになります。obj = (struct myStruct*) data;

  • それは可能ですか?そうするための解決策は何ですか?ベストプラクティス?

私は[]バイトのオフセットを使用して、インデックス無効にしたいと思います。

スライスが固定メモリではないので、私はそれが固定されたアレイbyte[0:2][]byteを変換することによって可能になるだろうと思います。

答えて

2

あなたは、バイトスライスの最初の要素へのポインタを渡す*myStructunsafe.Pointerをキャストすることができます

import "unsafe" 
... 
obj = (*myStruct)(unsafe.Pointer(&data[0])) 

テスト:https://play.golang.org/p/c7XO3dPKcLu

+0

なしゴーネイティブソリューション?このソリューションは、[]バイトの長さで動作しますか?スライスのメモリマップは連続していないので、私は、安全でないパッケージがコピーによってパフォーマンスを変えることなくそれを処理することができるかどうか、あるいは...ベンチマークでチェックします。 –

+2

@Alexis_FR_JPこれはGoネイティブであり、スライスは常に連続しています。 – JimB

+0

偉大な、私は '安全でない'を使用することを避けました。なぜなら、Rob Pikeは、 'unsafe 'をインポートするアプリケーションで生産に入るべきではないと聞いたからです。それにもっと集中する必要があります。ありがとうございました! –

関連する問題