我是Go的新手,不确定如何解决这个问题。在OOP术语中,我有一个基类Animal和两个Cat和Dog的子类。我想为Animal指定一个适用于所有动物的ToJson方法。
我的问题是,当我打电话给dog.ToJson()时,我只获得狗的Dog属性而没有动物属性。
如何让ToJson按预期工作(即with recursion)?
编辑:更改了代码以反映lbonn的回答建议,我无法按照自己的意愿去做。 edit2:代码更改后的一致性问题
package main
import (
"encoding/json"
"fmt"
)
type Animal struct {
Name string
}
type Cat struct {
CatProperty int64
Animal
}
type Dog struct {
DogProperty int64
Animal
}
func ToJson(i interface{}) []byte {
data,err := json.Marshal(i)
if err != nil {
panic("???")
}
return data
}
func main() {
dog := Dog{}
dog.Name = "rex"
dog.DogProperty = 2
fmt.Println(string(ToJson(dog)))
// Prints {"DogProperty":2}
// I want it to print {"Name":"rex","DogProperty":2}
}
答案 0 :(得分:4)
匿名字段的Json编码从第1页开始删除。希望它会回到1.1。有关详细信息,请参阅https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/jYMHbEv44r4。
所以现在使用标准库(使用go 1)可以获得的最佳效果是http://play.golang.org/p/LncNFeN8ys
你总是可以使用skelterjohn的补丁https://github.com/skelterjohn/json/来支持匿名字段,直到1.1发布。
或者使用提示,从修复此问题的来源安装。见https://codereview.appspot.com/6460044
答案 1 :(得分:2)
此处,ToJson
方法适用于Animal
的匿名字段Dog
。来电d.ToJson
只是d.Animal.ToJson
的可见性快捷方式。
GoLang Tutorials: Anonymous fields in struct
在这里,我会编写一个函数而不是一个方法(一个简单的Marshal
包装器):
func ToJson(i interface{}) []byte {
data,err := json.Marshal(i)
if err != nil {
panic("???")
}
return data
}
这不是动物或狗特有的,但实际上并不需要。
更一般地说,go中没有真正的继承概念。该语言中使用的对象范例与主流OOP完全不同,如Java或C ++。 Go FAQ提供了一些很好的说明。