继承和Json在Golang中的应用

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

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.

huangapple
  • 本文由 发表于 2017年1月8日 10:29:35
  • 转载请务必保留本文链接:https://go.coder-hub.com/41528850.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定