gob:使用接口对地图进行编码
尝试使用 Gob 对 map[string]interface{} 进行编码时,用户可能会遇到错误消息:“gob:类型未注册接口:map[string]interface {}。”出现此错误的原因是 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 编码器将成功编码将[string]interface{}映射到字节数组中。错误信息将不再显示。
以上是为什么 Gob 在编码 map[string]interface{} 时会抛出'gob:类型未注册接口:map[string]interface {}”?的详细内容。更多信息请关注PHP中文网其他相关文章!