Сообщение об ошибке гласит:
gob: OtherMsg не может быть назначен для типа MyMessage
Что верно.MyMessage
- это интерфейс, который требует, чтобы реализующие типы имели метод:
Id() *MyMessageHeader
Значение типа OtherMsg
не имеет такого метода в своем наборе метода , только указательдля него это значение типа *OtherMsg
(поскольку OtherMsg.Id()
имеет приемник указателя).
Чтобы это работало, зарегистрируйте значение типа *OtherMsg
:
gob.RegisterName("OtherMsg", &OtherMsg{})
Или просто:
gob.Register(&OtherMsg{})
См. Рабочий пример на игровой площадке Go:
func init() {
gob.Register(&OtherMsg{})
}
func main() {
var m MyMessage = &OtherMsg{
MyMessageHeader: MyMessageHeader{
MessageId: 1,
OtherId: 2,
},
OtherField: "othervalue",
}
data, err := MarshalMessage(m)
if err != nil {
panic(err)
}
m2, err := UnmarshalMessage(data)
if err != nil {
panic(err)
}
fmt.Printf("%+v\n", m2)
}
Выход (попробуйте на игровая площадка Go ):
&{MyMessageHeader:{MessageId:1 OtherId:2} OtherField:othervalue}