gob: インターフェースを使用したマップのエンコード
Gob を使用してマップ[文字列]インターフェース{}をエンコードしようとすると、エラーが発生する場合がありますメッセージ: 「gob: タイプがインターフェイスに登録されていません: マップ[文字列]インターフェイス {}。」このエラーは、Gob では、エンコードされるデータの型を処理する前に登録する必要があるために発生します。
この問題の解決策は簡単です。gob.Register 関数を使用して、Gob に型を登録します。この場合、次のコードをプログラムに追加する必要があります:
gob.Register(map[string]interface{}{})
この登録ステップは、文字列キーとインターフェイス値を使用してマップをエンコードおよびデコードできるようにする必要があることを Gob に通知します。
これを実証するために、次の修正されたコードを考えてみましょう:
package main import ( "bytes" "encoding/gob" "encoding/json" "fmt" "log" ) func CloneObject(a, b interface{}) []byte { gob.Register(map[string]interface{}{}) buff := new(bytes.Buffer) enc := gob.NewEncoder(buff) dec := gob.NewDecoder(buff) err := enc.Encode(a) if err != nil { log.Panic("e1: ", err) } b1 := buff.Bytes() err = dec.Decode(b) if err != nil { log.Panic("e2: ", err) } return b1 } func main() { var a interface{} a = map[string]interface{}{"X": 1} b2, err := json.Marshal(&a) fmt.Println(string(b2), err) var b interface{} b1 := CloneObject(&a, &b) fmt.Println(string(b1)) }
このコードが実行されると、Gob エンコーダーは正常にエンコードします。 map[string]interface{} をバイト配列に変換します。エラーメッセージは表示されなくなります。
以上がgob は、map[string]interface{} をエンコードするときに「gob: type not registered for interface: map[string]interface {}」をスローするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。