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

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

golang - gob encode interface error

问题

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

我的代码如下:

  1. package main
  2. import (
  3. "bytes"
  4. "encoding/gob"
  5. "fmt"
  6. )
  7. type Data struct {
  8. Id int
  9. D interface{}
  10. }
  11. type User struct {
  12. Name string
  13. Age int
  14. }
  15. func main() {
  16. // 正常工作-----------
  17. data := Data{
  18. Id: 99,
  19. D: []int{1, 2, 3},
  20. }
  21. m := new(bytes.Buffer)
  22. enc := gob.NewEncoder(m)
  23. err := enc.Encode(data)
  24. if err != nil {
  25. fmt.Println(err)
  26. return
  27. }
  28. fmt.Println(m)
  29. //-------------------
  30. // 错误 -------------
  31. user := User{
  32. Name: "Lei",
  33. Age: 25,
  34. }
  35. data = Data{
  36. Id: 100,
  37. D: user,
  38. }
  39. m = new(bytes.Buffer)
  40. enc = gob.NewEncoder(m)
  41. err = enc.Encode(data)
  42. //err - gob: type not registered for interface: main.User
  43. if err != nil {
  44. fmt.Println(err)
  45. return
  46. }
  47. fmt.Println(m)
  48. }

你可以在这里查看代码: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:

  1. package main
  2. import (
  3. "bytes"
  4. "encoding/gob"
  5. "fmt"
  6. )
  7. type Data struct {
  8. Id int
  9. D interface{}
  10. }
  11. type User struct {
  12. Name string
  13. Age int
  14. }
  15. func main() {
  16. //work well-----------
  17. data := Data{
  18. Id:99,
  19. D: []int{1,2,3},
  20. }
  21. m := new(bytes.Buffer)
  22. enc := gob.NewEncoder(m)
  23. err := enc.Encode(data)
  24. if err != nil {
  25. fmt.Println(err)
  26. return
  27. }
  28. fmt.Println(m)
  29. //-------------------
  30. //error -------------
  31. user := User{
  32. Name: "Lei",
  33. Age: 25,
  34. }
  35. data = Data{
  36. Id: 100,
  37. D: user,
  38. }
  39. m = new(bytes.Buffer)
  40. enc = gob.NewEncoder(m)
  41. err = enc.Encode(data)
  42. //err - gob: type not registered for interface: main.User
  43. if err != nil {
  44. fmt.Println(err)
  45. return
  46. }
  47. fmt.Println(m)
  48. }

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

答案1

得分: 4

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

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

You need to register your interface beforehand:

  1. gob.Register(user)
  2. enc = gob.NewEncoder(m)
  3. 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:

确定