如何编组结构,就好像它是一个匿名结构一样?

该文档指出:


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


例如:


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。


拉风的咖菲猫
浏览 77回答 1
1回答

慕丝7291255

您必须为此实现自定义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    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go