这是一个例子(另见 https://play.golang.org/p/or7z4Xc8tN ):
package main
import (
"encoding/json"
"fmt"
)
type A struct {
X string
Y int
}
type B struct {
A
Y string
}
func main() {
data := []byte(`{"X": "me", "Y": "hi"}`)
b := &B{}
json.Unmarshal(data, b)
fmt.Println(b)
fmt.Println(b.A)
b = &B{}
data = []byte(`{"X": "me", "Y": 123}`)
json.Unmarshal(data, b)
fmt.Println(b)
fmt.Println(b.A)
}
哪些输出:
&{{me 0} hi}
{me 0}
&{{me 0} }
{me 0}
有没有办法将字段 Y 多态解码为 int 或字符串?还是因为定义了 B.Y,甚至完全解码为 A.Y?
我知道有些人可能会建议使用 json.Unmarshall(data, &b.A)
之类的东西进行解码,但我不知道我是否可以将其融入我当前的设计中。
最佳答案
Go 唯一的多态是接口(interface)。嵌入不提供多态性。
如果您尝试解码 JSON,但您无法假设其中一个字段将是什么类型,您可以使用 interface{}
类型的字段以及类型断言, fmt.Sprint
,或者反射。您应该使用哪个取决于特定的用例——一旦您获得了值(value),您将如何处理它?在某些时候,您必须关心它是 int
还是 string
,这将决定您如何处理该值。
关于json - 嵌入式结构的多态 JSON 解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44380095/