使用 yaml.v2 检索结构的映射而不是结构的切片

Posted

技术标签:

【中文标题】使用 yaml.v2 检索结构的映射而不是结构的切片【英文标题】:Retrieving map of struct instead of slice of struct using yaml.v2 【发布时间】:2021-12-13 21:29:43 【问题描述】:

我有一个 yaml 文件,其结构如下,无法更改。

fruit:
  - cost: 10
    name: apple
  - cost: 20
    name: banana

我为此创建了以下结构:

type T struct 
    Fruit []struct 
        Cost int    `yaml:"cost"`
        Name string `yaml:"name"`
     `yaml:"fruit"`

当我使用 yaml.v2 将 yaml 解组到结构时,我正确地得到以下信息:

[10 apple 20 banana]

有没有一种方法可以获得结构的映射,这样我就不必为了找到苹果的成本而一次又一次地循环切片:

map[apple:apple 10 banana:banana 20]

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

作为一个选项,您可以实现自定义Unmarshaler

type T struct 
    Fruit map[string]Fruit


type Fruit struct 
    Cost int    `yaml:"cost"`
    Name string `yaml:"name"`


func (t *T) UnmarshalYAML(unmarshal func(interface) error) error 
    var tmpStruct struct 
        Fruit []Fruit `yaml:"fruit"`
    

    err := unmarshal(&tmpStruct)
    if err != nil 
        return err
    
    
    fruit := make(map[string]Fruit, len(tmpStruct.Fruit))
    for _, f := range tmpStruct.Fruit 
        fruit[f.Name] = f
    
    
    *t = TFruit: fruit
    return nil

PLAYGROUND

【讨论】:

以上是关于使用 yaml.v2 检索结构的映射而不是结构的切片的主要内容,如果未能解决你的问题,请参考以下文章

34.Go YAML

Go语言之读取yaml配置文件,转换成struct结构,json形式输出

ES 检索 wordpdf 文档插件 ingest attachment 的管道配置和文档结构映射

Lucene:虽不是全文检索引擎,却强大依旧

ES 检索 wordpdf 文档插件 ingest attachment 的管道配置和文档结构映射

将数据从 Firestore 映射到 Swift 中的结构 - IOS