gpt4 book ai didi

go - 将 YAML 解码为 Go 中具有意外字段的结构

转载 作者:IT王子 更新时间:2023-10-29 02:21:14 27 4
gpt4 key购买 nike

我在尝试使用 github.com/go-yaml/yaml 解码具有未导出字段的结构时遇到问题。结构看起来像:

type Example struct {
ExportedField string `yaml:"exported-field"`
OneMoreExported string `yaml:"one-more-exported"`
unexportedField map[string]*AnotherExample `yaml:"unexported-field"`
}

type AnotherExample struct {
Name string `yaml:"name"`
}

我想将这样的 YAML 解码为

exported-field: lorem ipsum
one-more-exported: dolor set
unexported-field:
something:
name: anything

我尝试的是自定义解码器:

func (example *Example) UnmarshalYAML(unmarshal func(interface{}) error) error {
type Alias Example
tmp := struct {
UnexportedField map[string]*AnotherExample `yaml:"unexported-field"`
*Alias
}{
Alias: (*Alias)(example),
}
if err := unmarshal(&tmp); err != nil {
return err
}
if tmp.UnexportedField != nil {
example.unexportedField = tmp.UnexportedField
}
example.CopyJobNonNil(Example(*tmp.Alias)) // Copies all the non-nil fields from the passed Example instance

return nil
}

tmp 在调用 unmarshal() 后不包含任何字段,但 unexportedField — 其他字段似乎被省略。

Go Playground 上重现的问题(尽管由于依赖关系它无法正常工作):https://play.golang.org/p/XZg7tEPGXna

最佳答案

因为大多数 Go 解码包(包括 encoding/* 包)使用 reflect 包来获取结构字段,而 reflect 可以不能访问未导出的结构字段,解码器无法解析为未导出的字段。

也就是说,还是有办法做到的。您可以将 YAML 解码为具有公共(public)字段的未导出类型,然后可以将其嵌入到导出类型中。同一个包中的 getter 和 setter 可以只使用嵌入式结构。

例如:

// Define the types...

type innerData struct {
ExportedField string
unexportedField string
}

type Data struct {
innerData
}


// and then...

d := Data{}
DoSomeUnmarshalling(yamlbytes, &d.innerData)


// and then you can use getters/setters/whatever on `Data`

func (d *Data) GetUnexported() string {
return d.innerData.unexportedField;
}

(警告:完全未经测试)

参见 JSON and dealing with unexported fields供引用。

关于go - 将 YAML 解码为 Go 中具有意外字段的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48674624/

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