【问题标题】:How to correctly parse rune parameter in YAML file如何正确解析 YAML 文件中的符文参数
【发布时间】:2021-07-05 17:35:08
【问题描述】:

我尝试像这样在 Yaml 中传递 rune 参数:

CsvDelimiter: ';'

然后我将 yaml 解析为结构

type Params struct {
  ...
  CsvDelimiter rune `yaml: "CsvDelimiter"`
  ...
}

但 Params.CsvDelimiter 为空

如何正确地从 Yaml 传递符文参数?

【问题讨论】:

  • 你能提供你的代码而不是描述它的作用吗?查看创建minimum reproducible example
  • 你使用的是什么 yaml 包?常用的gopkg.in/yaml.v3v2返回一个错误,明确指出不支持你想要的"cannot unmarshal !!str ; into int32"(Go rune类型是int32,仅供参考)

标签: go yaml


【解决方案1】:

假设您使用的是gopkg.in/yaml.v3 包,您可以声明一个自定义符文类型并让它实现Unmarshaler 接口。

type Rune rune

func (r *Rune) UnmarshalYAML(n *yaml.Node) error {
    var s string
    if err := n.Decode(&s); err != nil {
        return err
    }
    
    rn, _ := utf8.DecodeRune([]byte(s))
    *r = Rune(rn)
    return nil
}

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

【讨论】:

    【解决方案2】:

    YAML 解组器不知道如何处理符文,但您可以像这样从字符串中提取符文。

    package main
    
    import (
        "fmt"
        "gopkg.in/yaml.v2"
    )
    
    type Params struct {
        CsvDelimiter string `yaml:"CsvDelimiter"`
    }
    
    func main() {
        str := `CsvDelimiter: ';'`
        params := Params{}
        err := yaml.Unmarshal([]byte(str), &params)
        if err != nil {
            panic(err)
        }
        fmt.Println(rune(params.CsvDelimiter[0]))
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-19
      • 1970-01-01
      • 2014-11-05
      相关资源
      最近更新 更多