問題タブ [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.

0 投票する
1 に答える
1772 参照

map - TCP 接続オブジェクトを他の Go モジュールに渡すにはどうすればよいですか?

Go で作成しているアプリケーションのさまざまなモジュールに渡そうとしている接続へのホスト名のマップがあります。

メインの server.go ファイルで、ネットワーク内の他のサーバーにダイヤルし、接続を次のマップに保存します。

次に、このマップを他のモジュールに送信して、接続を再利用したいと考えています。学習者モジュールに送信する方法の例を次に示します。

学習者モジュールでは、マップを取得し、マップに含まれる各接続で gob.Decoder の使用を試みます。

そしてリッスン機能内:

問題は、decoder.Decode(proposal) をここで呼び出すと、パニックが発生することです。

私はこの同じエンコード/デコード コードを他の場所で問題なく使用しています。唯一の違いは、同じ関数内で新しい接続を確立した直後にデコードを呼び出すのではなく、接続を再利用しようとしていることです。私はこれを何時間も機能させようとしてきました。参照によって物事を渡したり、map[string]interface{} を使用したり、あらゆる種類の運が悪いです。Gob.decode は、基になる net.Conn オブジェクトで何かがエンコードされるまでブロックする必要がありますよね? この時点で、 net.Conn オブジェクトが何らかの形で無効化されているとしか思えません。

接続オブジェクトを渡す方法に何か問題がありますか? net.Conn は非常に単純なオブジェクトであり、値渡しに適していると読みましたが、何かが欠けているに違いありません。type interface{} を使用して参照渡ししようとすると、次のようなエラーが発生しました。

gob.Decode を誤用している場合、net.Conn オブジェクトをマップに配置する際に問題がある場合、または問題がまったく別のものである場合、接続オブジェクトの何が問題なのかを突き止めようとしています。 .

何か案は?

編集: 完全なパニック トレースバックは以下のとおりです。

更新: 問題が見つかりました! fmt.Println(conn) だけでより多くの情報を取得できることに気づかず、conn が nil であることがわかり、それがパニックを引き起こしました。お手数をおかけいたしますが、よろしくお願いいたします。

0 投票する
2 に答える
1643 参照

json - Goで基になる型を一致させながらJSONをインターフェイス変数に非整列化する

必要な追加機能を使用してマップするラッパーを作成しています。最も重要なことのいくつかは、汎用性を維持しながらデータをマーシャリングおよびアンマーシャリングする機能です。エンコーディング/gob エンコーダーを使用してマーシャラーを作成することができましたが、マーシャリングされたデータが人間が読み取れるものであればよいので、JSON を使用して別の実装をコーディングすることにしました。

Register() を使用して実装オブジェクトのインスタンスを渡すことで、ジェネリック インターフェイス変数から適切にエンコードおよびデコードできるようになりました。(このリソースは詳細に役立ちました! http://www.funcmain.com/gob_encoding_an_interface )

ただし、JSON には Register() がありません。タイプの値があるとしましょう

タイプの変数で

それをマーシャリングすると、次のような JSON が出力されます。

そして、それをジェネリックバリュー型の変数に再びアンマーシャリングしようとすると、次のように表示されます。

パニック: インターフェースの変換: map[string]interface {} はジェネリックではありませんValue: メソッドがありません キーの編集: おっと、実際にはこうなっています!

明らかに、http: //blog.golang.org/json-and-goに記載されているようにデータをマーシャリングしようとします(「インターフェースを使用したジェネリック JSON{}」を参照)。

実装がRegister()されている場合にgobデコーダーが試行するように、データを特定の実装に適合させるにはどうすればよいですか? Register() は天の恵みであり、一般的にマーシャリングとアンマーシャリングを何もないかのように行うことができました。JSON で同じことを行うにはどうすればよいですか?

0 投票する
1 に答える
398 参照

go - ストリーム処理における Gob の使用例

Gob は、文書化されているように、構造体の大きなスライスやストリーミング データなどの内部的に繰り返されるデータ構造を処理する場合、スペースとパフォーマンスの効率に優れています。ただし、検索しても直接の例は見つかりません。

(おそらく無限の)ストリーミング入力で使用する方法の例を誰かが提供またはリンクできますか? (キューから読み取るワーカーのように)

0 投票する
2 に答える
3015 参照

go - RPC 接続を共有する Golang ゴルーチン

専用のゴルーチンで受信リクエストを処理する Golang サーバーがあります。これらの goroutine は、rpc/gob を使用して別のバックエンド go サーバーにアクセスします。Gob の動作を改善するために接続を再利用する場合 (接続を共有する要求は、再送信せずにメタデータを再利用する可能性があり、TCP 開始の時間を節約することもできます)、接続プールに似たメカニズム (mysql クライアント プールなど) を実装することを考えていますが、その前に重要なことを見逃していませんか?

そのような共有 RPC クライアントを処理する Go 固有の方法はありますか? または、この状況を処理するために構築されたプロジェクトはありますか?

0 投票する
1 に答える
1501 参照

go - GoでGobデータにSnappy圧縮を使用していますか?

構造をディスクに保存し、後で再度読み込む必要があります。IO を最小限に抑えようとしていますが、ファイルの圧縮と解凍に何年も費やさないようにしています。したがって、圧縮には非常に高速な Snappy を使用する予定です。そして比較的効率的です。

通常、ゴブをファイルに保存するときに、次のように gzip 圧縮します。

しかし、Snappy は、他のすべてが使用しているように見えるこれらのリーダー/ライター インターフェイスには接続しません。代わりに、基本的な機能を提供するだけです: https://godoc.org/code.google.com/p/snappy-go/snappy

func Encode(dst, src []byte) ([]byte, error)

func Decode(dst, src []byte) ([]byte, error)

このSnappyパッケージを使用して、ゴブデータをファイルに保存するときに圧縮する(そしてそれを読み戻す)最も効率的な方法は何ですか? 理想的には、ioutil.ReadAll を使用して gob リー​​ダーからバイトのスライスを読み取ってから、それをもう一度圧縮することはしたくありません。 .

リーダーとライターのインターフェイスがどのように機能するかを完全には理解していないことを認めます。

0 投票する
1 に答える
627 参照

go - gob を使用して、再帰的に定義された構造体をパッケージ化します

私は主にPythonを使用していますが、Goで遊んでいます。私はPythonで非常に簡単なことをするために次のように書きました.Goでもそれが達成できることを願っています.

ご覧のとおり、2 つのカスタム構造体があり、それぞれが相互の参照を再帰的に含んでいます。gob を使用してファイルにパッケージ化しようとすると、コンパイルされますが、スタック オーバーフローが発生します。これは再帰が原因であると想定しています。私の経験では、pickle はこのようなことをあえぎなく処理します。私は何を間違っていますか?

0 投票する
1 に答える
1418 参照

encoding - 空の文字列をエンコード/デコードする方法

私は自分のプロジェクトに GOB エンコーディングを使用していますが、(長い戦いの後) 空の文字列が正しくエンコード/デコードされていないことがわかりました。私のコードでは、エラー メッセージ (文字列) を使用して問題を報告します。このエラー メッセージはほとんどの場合空です。空の文字列をエンコードすると、何も表示されなくなり、デコードに問題が発生します。これらの部分が最も使用されるため、エンコード/デコードを変更したくありません。空の文字列をエンコード/デコードする方法をGoに伝えるにはどうすればよいですか?

例: Playgroundの作業コード。 Playgroundが動作しないコード。