英文:
Inheritance & Json in Golang
问题
有两个结构体 A 和 B。B 包含 A。A 上附加了一个函数,它返回父对象的 JSON。当我在 B 的实例上调用该函数时,我希望能看到 JSON 中的所有对象字段,但实际上我只得到了 A 的字段。请看一下代码:
type A struct {
Foo string
}
type B struct {
A
Bar string
}
func (object *A) toJson() []byte {
res, _ := json.Marshal(&object)
return res
}
func main() {
b := B{}
fmt.Println(string(b.toJson()))
}
我期望得到的结果是 {"Foo":"", "Bar":""},但实际上得到的结果是 {"Foo":""}。第一种解决方法是为这两个结构体分别定义两个不同的函数。但是否有第二种解决方案只使用一个函数呢?谢谢您的帮助。
英文:
There are two structures A & B. B includes A. Also there is a function attached to A. It returns json of the parent object. I expect to see all object fields in json when I call the fonction on instance of B, but I get only fields of A. Please look at the code:
type A struct {
Foo string
}
type B struct {
A
Bar string
}
func (object *A) toJson() []byte {
res, _ := json.Marshal(&object)
return res
}
func main() {
b := B{}
fmt.Println(string(b.toJson()))
}
I expect to get {"Foo":"", "Bar":""} but the result is {"Foo":""}. The first way is to define two separate functions for both of structures. But is there the second solution with one function? Thank you in advance.
答案1
得分: 5
你的方法toJson()来自结构体A。将其更改为结构体B,然后你将获得你期望的结果。
package main
import (
"encoding/json"
"fmt"
)
type A struct {
Foo string `json:"foo"`
}
type B struct {
A
Bar string `json:"bar"`
}
func (object *B) toJson() []byte {
res, _ := json.Marshal(&object)
return res
}
func main() {
c := B{}
fmt.Println(string(c.toJson()))
}
请注意,我已经将代码中的引号从直角引号(`)更改为双引号("),以便代码能够正确运行。
英文:
Your methodn toJson() is from A struct. change it to struct B then you will get your expected result.
package main
import (
"encoding/json"
"fmt"
)
type A struct {
Foo string `json:"foo"`
}
type B struct {
A
Bar string `json:"bar"`
}
func (object *B) toJson() []byte {
res, _ := json.Marshal(&object)
return res
}
func main() {
c := B{}
fmt.Println(string(c.toJson()))
}
答案2
得分: 2
由于toJson
是为A
定义的,它在b.A
上操作。在Go语言中,嵌入类型与其他语言中的子类化不同。请参考https://golang.org/doc/effective_go.html#embedding。
英文:
Since toJson
is defined for A
, it operates on b.A
. Embedding a type in Go is not the same as subclassing in other languages. See https://golang.org/doc/effective_go.html#embedding.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论