gpt4 book ai didi

具有多个嵌入结构的 Go MarshalJSON 行为

转载 作者:行者123 更新时间:2023-12-03 08:06:50 29 4
gpt4 key购买 nike

我正在测试带有嵌入式结构的 go json 编码(marshal)处理。但是,我发现当我嵌入 time.Time 时,为什么它总是覆盖其他嵌入的结构,即使它们也提供自己的自定义编码(marshal)处理?下面的代码总是打印出 "0001-01-01T00:00:00Z"

package main

import (
"encoding/json"
"fmt"
"time"
)

type A struct {
}

func (a A) Print() {
fmt.Println("A")
}

type B struct {
B int
}

func (a A) MarshalJSON() ([]byte, error) {
return []byte(`"a"`), nil
}

func (b B) MarshalJSON() ([]byte, error) {
return []byte(`"b"`), nil
}

func (a B) Print() {
fmt.Println("A")
}

type C struct {
A
B
time.Time
C int `json:"C"`
}

func main() {
fmt.Println("Hello, 世界")
c := C{}
decode, err := json.Marshal(c)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(decode))
}

最佳答案

如果您嵌入具有相同名称字段或方法的多个类型,则这些字段或方法将无法再直接访问。

Selectors :

x.f

  1. For a value x of type T or *T where T is not a pointer orinterface type, x.f denotes the field or method at the shallowest depthin T where there is such an f. If there is not exactly one fwith shallowest depth, the selector expression is illegal.

这意味着,给定以下一组类型:

type S1 struct { F string }

type S2 struct { F string }

type S3 struct {
S1
S2
}

表达式s3.F是非法的:

var s3 S3
_ = s3.F // ambiguous selector s3.F

这是因为在最浅的深度有多个F。您可以试试playground .

相同的规则适用于方法。由此可见,您的类型C不满足json.Marshaler接口(interface)因为它在相同的深度嵌入,更多实现 MarshalJSON() 方法的一个类型。您可以在 playground 上亲自查看.


然而,问题仍然是为什么无论如何都要使用嵌入的 time.Time 的自定义编码(marshal)处理。这是因为 time.Time 不仅实现了 json.Marshaler 接口(interface),还实现了 encoding.TextMarshaler 接口(interface)( docs & playground )。还有 json.Marshaldocumentation说如下:

Marshal traverses the value v recursively. If an encountered valueimplements the Marshaler interface and is not a nil pointer, Marshalcalls its MarshalJSON method to produce JSON. If no MarshalJSON methodis present but the value implements encoding.TextMarshaler instead,Marshal calls its MarshalText method and encodes the result as a JSONstring.

您可以see here一旦您还让 AB 实现 encoding.TextMarshaler 接口(interface),则上述行为成立,然后 time.TimeMarshalText 方法将不再使用。

关于具有多个嵌入结构的 Go MarshalJSON 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72052635/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com