問題タブ [gob]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
go - 構造体のインターフェイスの gob デコードと raw の違い
インターフェイス型が構造体に埋め込まれている場合と、まったく埋め込まれていない場合のインターフェイス型のエンコード/デコードの違いを理解するのに苦労しています。
次の例を使用します。
コードが interface を宣言していることに注意してくださいIFace
。エクスポートされていない struct を宣言していimpl
ます。Register
、GobEncode
、およびstructGobDecode
にいくつかの Gob メソッドを設定します。impl
次に、エクスポートされる構造体も宣言し、インターフェース タイプのData
単一フィールドを持ちます。Foo
IFace
したがって、インターフェース、それを実装する構造体、および値がそのインターフェース型であるフィールドを持つコンテナー構造体があります。
私の問題は、コンテナー構造体Data
が Gob gauntlet を介して問題なく送信され、それが通過すると、構造体の IFace フィールドを問題なくエンコードおよびデコードすることData
です...すばらしい! しかし、ゴブ ガントレットを介して IFace 値のインスタンスだけを送信することはできないようです。
私が見逃している魔法の呼び出しは何ですか?
エラーメッセージを検索すると多くの結果が得られますが、私はゴブ契約を満たしていると信じています....そしてその「証拠」は構造体のゴビングの成功にあります。明らかに私は何かを見逃していますが、それを見ることはできません。
プログラムの出力は次のとおりです。
実際のコードは次のとおりです。
encoding - 次の変数の Golang Gob タイプ
golang -> encoding/gob を使用する場合、次に取得する変数の型を決定したいと考えています。それを行う1つの方法は、列挙型と未知の変数を交互に使用することです。列挙型は次の変数が何であるかを教えてくれます。
ただし、gob-stream は次の変数の型を既に認識しています。(または、少なくともそれは私にとっては十分な名前です。) この例でわかるように:
次に取得するものは名前ベクトルを持つ構造体でなければならず、エラーがスローされることがわかります。事前に次のタイプを照会する方法はありますか。(繰り返しますが、明示的に送信しないと、実際には不要なオーバーヘッドが発生します)
file - 数回追加してファイルに書き込まれたゴブを取得する
encoding/gob を使用してデータをファイルに保存し、後でロードしようとしています。新しいデータをファイルに追加し、アプリケーションを再起動した後など、保存したすべてのデータを後でロードできるようにしたいと考えています。Encode() を使用してファイルに保存している間は問題ありませんが、読み取ると、簡潔に保存されたアイテムではなく、最初に保存されたアイテムのみが常に取得されるようです。
最小限の例を次に示します: https://play.golang.org/p/patGkKDLhM
ご覧のとおり、エンコーダーに 2 回書き込み、次にそれを読み戻すことができます。ただし、ファイルを閉じて追加モードで再度開くと、書き込みは機能しているように見えますが、読み取りは最初の 2 つの要素 (以前に書き込まれたもの) に対してのみ機能します。新しく追加された 2 つの構造体を取得できません。次のエラーが表示されます。
パニック: バッファ内の余分なデータ
ディスク上のファイルで golang gob に追加することを認識しており、 https://groups.google.com/forum/#!topic/golang-nuts/bn6vjC5Abd8も読んでいます
最後に、https://gist.github.com/kjk/8015952も見つけました。これは、私がやろうとしていることがうまくいかないことを示しているようです。なんで?このエラーはどういう意味ですか?
pointers - gob が nil 値をデコードしようとすると、EOF エラーが発生します
一部のデータをエンコードするために を使用する必要がありgob
ますが、「type nil」を正しく処理できないことがわかりました (go 1.6.2)
https://play.golang.org/p/faypK8uobF
出力:
file - gob を使用してファイルにデータを適切に保存できない
エンコーダーmap[mapKey]string
を使用してタイプのマップをファイルに保存しようとすると、文字列がファイルに保存されません。gob
mapKey
これが構造体であり、マップ値は長いjson文字列です。
そして、次のような構造体の代わりにネストされたマップを使用するときはいつでも:
正常に動作し、文字列を適切に保存しています。ここで何が欠けているのかわかりません。
エンコード、デコードしてファイルに保存するコード: