如何将结构封送为匿名结构



文档说明:

匿名结构字段通常被封送处理,就好像它们的内部导出字段是外部结构中的字段一样。

例如:

type foo struct {
Foo1 string `json:"foo1"`
Foo2 string `json:"foo2"`
}
type boo struct {
Boo1 string `json:"boo1"`
foo
}

我这样做:

s := boo{
Boo: "boo1",
foo: foo{
Foo1: "foo1",
Foo2: "foo2",
},
}
b, err := json.MarshalIndent(s, "", "   ")
fmt.Println(string(b))

我得到这个:

{
"boo1": "boo1",
"foo1": "foo1",
"foo2": "foo2"
}

但是,当foo是而不是匿名结构时,我如何才能获得相同的结果?含义:

type boo struct {
Boo string `json:"boo"`
Foo foo
}

同时也对json进行解组。

您必须为此实现一个自定义的json.Marshaler

type boo struct {
Boo1 string `json:"boo1"`
// "-" will tell encoding/json to ignore this field during (un)marshaling
Foo foo `json:"-"`
}
func (b boo) MarshalJSON() ([]byte, error) {
// Declare a new type using boo's definition, this
// "copies" boo's structure but not its behaviour,
// i.e. B has same fields as boo, but zero methods,
// not even MarshalJSON -- this is necessary to avoid
// infinite recursive calls to MarshalJSON.
type B boo
// Declare a new type that *embeds* those structs whose
// fields you want to be at the same level.
type T struct {
B
foo
}
// Create an instance of the new type with its fields
// set from the source boo instance and marshal it.
return json.Marshal(T{B: B(b), foo: b.Foo})
}

https://play.golang.org/p/Go1w9quPkMa


关于";匿名的">

标签匿名在您使用时,以及在您引用的文档中使用时,都是过时且不精确的。没有显式名称的字段的正确标签是嵌入的。

https://golang.org/ref/spec#Struct_types

用类型声明但没有显式字段名的字段称为嵌入式字段嵌入字段必须指定为类型名称T或者作为指向非接口类型名称*T的指针,而T本身可能不是是指针类型。不合格的类型名称充当字段名称。

区别很重要,因为有这样一件事:;匿名结构字段";在Go中,它经常被使用,但它与嵌入的字段不同。例如:

type T struct {
// F is an anonymous struct field, or
// a field of an anonymous struct type.
// F is not embedded however.
F struct {
foo string
bar int
}
}

相关内容

  • 没有找到相关文章

最新更新