1

interface{}値のバイト表現を保存および取得する必要があります。明確にするために、サイズに関係なく、スライスにパックされた基になる値を格納しようとはしていませんが、その値へのポインターを格納する方法を探しています。

私がただ行けない理由type MyType interface{}; var arr []MyTypeは、この配列内に不均一な量の他のバイトをパックしているためです。

これを実装するために、reflectパッケージと安全でないパッケージを調べていUnsafeAddrます。ポインタを返すようなメソッドがあります。そのポインタを保存して、後でインターフェイス{}値にデコードして戻すことはできますか?

私が見る別の関数はInterfaceData、2バイトの配列表現を返すものですが、それをインターフェイス値に戻す方法はありますか?

私の高レベルの目標はこれです:

// store the pointer to dataIn in the slice b
func putPtr(b []byte, dataIn interface{}) { ... }

// return the pointed to interface value from within b
func getInter(b []byte) interface{} { ... }
4

1 に答える 1

5

理由が何であれ、一般的なケースでは機能しないことが保証されています。ガベージ コレクター (GC) の認識からポインターを非表示にし、可能なトリックでそれを再生成すると、そのポインター (ポインター) は無効になる可能性があります。GC がどのように機能するかが全体の原則です。

この失敗を回避するには、どこか別の場所でポインターを GC から見えるようにしておく必要があります。GC が (予測不可能な) 瞬間にポインターを収集しないように、ポインターは到達可能なままにしておく必要があります。

しかし、利用可能なポインターの通常の到達可能な表現がある場合、そもそも他の ([] バイトでエンコードされたような) 表現は必要ありません。

于 2013-03-09T20:36:35.873 に答える