在Go语言中,使用gob编码接口时可能会出现错误。

huangapple go评论83阅读模式
英文:

golang - gob encode interface error

问题

我遇到了golang gob编码的问题。当我使用结构体对接口进行编码时,出现了错误。

我的代码如下:

package main

import (
	"bytes"
	"encoding/gob"
	"fmt"
)

type Data struct {
	Id int
	D  interface{}
}

type User struct {
	Name string
	Age  int
}

func main() {
	// 正常工作-----------
	data := Data{
		Id: 99,
		D:  []int{1, 2, 3},
	}
	m := new(bytes.Buffer)
	enc := gob.NewEncoder(m)
	err := enc.Encode(data)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(m)
	//-------------------

	// 错误 -------------
	user := User{
		Name: "Lei",
		Age:  25,
	}
	data = Data{
		Id: 100,
		D:  user,
	}
	m = new(bytes.Buffer)
	enc = gob.NewEncoder(m)
	err = enc.Encode(data)
	//err - gob: type not registered for interface: main.User
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(m)
}

你可以在这里查看代码:http://play.golang.org/p/amhhQjsIjt

请问有什么我可以帮助你的吗?

英文:

I have problem with golang gob encode. there is a error when i encode interface with struct.

my code:

package main

import (
	"bytes"
	"encoding/gob"
	"fmt"
)

type Data struct {
	Id int
	D  interface{}
}

type User struct {
	Name string
	Age  int
}

func main() {
	//work well-----------
	data := Data{
		Id:99,
		D: []int{1,2,3},
	}
	m := new(bytes.Buffer)
	enc := gob.NewEncoder(m)
	err := enc.Encode(data)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(m)
	//-------------------
	
	//error -------------
	user := User{
		Name: "Lei",
		Age: 25,
	}
	data = Data{
		Id: 100,
		D: user,
	}
	m = new(bytes.Buffer)
	enc = gob.NewEncoder(m)
	err = enc.Encode(data)
	//err - gob: type not registered for interface: main.User
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(m)

	
}

http://play.golang.org/p/amhhQjsIjt

答案1

得分: 4

你需要事先注册你的接口:

gob.Register(user)
enc = gob.NewEncoder(m)
err = enc.Encode(data)
英文:

You need to register your interface beforehand:

gob.Register(user)
enc = gob.NewEncoder(m)
err = enc.Encode(data)

huangapple
  • 本文由 发表于 2014年7月1日 18:31:51
  • 转载请务必保留本文链接:https://go.coder-hub.com/24508049.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定