Rumah > Artikel > pembangunan bahagian belakang > Mengapakah saya mendapat ralat "gob: type not registered for interface: map[string]interface {}" dalam Go?
Ralat: "gob: type not registered for interface: map[string]interface {}"
Dalam Go, pakej gob menyediakan sokongan untuk pengekodan dan penyahkodan nilai ke dalam perwakilan binari. Walau bagaimanapun, apabila cuba mengekod nilai peta[rentetan]antaramuka{} menggunakan gob, anda mungkin menghadapi ralat:
gob: type not registered for interface: map[string]interface {}
Ralat ini menandakan bahawa pakej gob tidak mengetahui jenis peta[rentetan] antara muka{}. Untuk menyelesaikan isu ini, anda mesti mendaftarkan jenis secara eksplisit menggunakan fungsi gob.Register.
gob.Register(map[string]interface{}{})
Dengan mendaftarkan jenis, anda memaklumkan pakej gob bahawa ia harus mengenali dan mengendalikan map[string]interface{ } nilai semasa operasi pengekodan dan penyahkodan.
Berikut ialah versi ubah suai kod yang anda berikan yang merangkumi pendaftaran yang diperlukan:
package main import ( "bytes" "encoding/gob" "encoding/json" "fmt" "log" ) func CloneObject(a, b interface{}) []byte { buff := new(bytes.Buffer) enc := gob.NewEncoder(buff) dec := gob.NewDecoder(buff) // Register the map[string]interface{} type for encoding gob.Register(map[string]interface{}{}) 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)) }
Selepas mendaftarkan jenis, anda boleh berjaya mengekod dan menyahkod peta nilai [rentetan]antara muka{} menggunakan gob.
Atas ialah kandungan terperinci Mengapakah saya mendapat ralat "gob: type not registered for interface: map[string]interface {}" dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!