2

我是 Go 新手,不确定如何解决这个问题。在 OOP 术语中,我有一个 Animal 基类和两个 Cat 和 Dog 子类。我想为 Animal 指定一个适用于所有动物的 ToJson 方法。

我的问题是,当我调用 dog.ToJson() 时,我只得到 dog 的 Dog 属性,而没有得到 Animal 的属性。

如何使 ToJson 按预期工作(即使用递归)?

编辑:更改代码以反映 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}
}
4

2 回答 2

4

匿名字段的 Json 编码已从 go 1 中删除。希望它将回到 go 1.1 中。有关更多详细信息,请参阅 https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/jYMHbEv44r4

因此,您现在可以使用标准库(使用 go 1)获得的最佳效果是http://play.golang.org/p/LncNFeN8ys

在 go 1.1 发布之前,您始终可以使用 skelterjohn 的补丁https://github.com/skelterjohn/json/来支持匿名字段。

或使用提示,从已修复此问题的源安装。见https://codereview.appspot.com/6460044

于 2012-12-29T05:45:59.403 回答
2

此处,该ToJson方法适用于 的匿名字段AnimalDog该调用d.ToJson只是d.Animal.ToJson. GoLang 教程:结构中的匿名字段

在这里,我将编写一个函数而不是一个方法(一个简单的包装器Marshal):

func ToJson(i interface{}) []byte {
    data,err := json.Marshal(i)
    if err != nil {
        panic("???")
    }
    return data
}

这不是特定于动物或狗,但实际上并不需要。

更一般地说,go 中没有真正的继承概念。该语言中使用的对象范式与主流 OOP 完全不同,例如 Java 或 C++。Go FAQ提供了一些很好的说明。

于 2012-12-29T04:10:18.387 回答