为了账号安全,请及时绑定邮箱和手机立即绑定

将结构解组为包含注释的字符串

将结构解组为包含注释的字符串

Go
至尊宝的传说 2022-06-21 10:23:54
我想部分读取yaml,即解码Type/Description键,但将Sample定义结构的键-保留为纯字符串。目的是定义用于解码的测试数据集。例子:type: defaultdescription: test datasample:  some: # want    complex: # comments    - struct # included我希望子键sample作为纯字符串返回。我尝试使用带有解组器接口(gopkg.in/yaml.v2)的别名类型:type plain string // implements UnmarshalYAML但以:panic: yaml: unmarshal errors:  line 4: cannot unmarshal !!map into []uint8我找不到使用UnmarshalYAML自定义字符串类型或强制转换为字符串的简单方法?
查看完整描述

2 回答

?
白板的微信

TA贡献1883条经验 获得超3个赞

您应该知道,通过阅读评论,您违反了 YAML 规范,该规范明确规定评论不得传达内容信息。


无论如何,go-yaml v3 提供了yaml.Node中间子结构的类型:


package main


import (

  "fmt"

  "gopkg.in/yaml.v3"

)


type file struct {

  Type string

  Description string

  Sample yaml.Node

}


var input []byte = []byte(`

type: default

description: test data

sample:

  some: # want

    complex: # comments

    - struct # included

`)


func main() {

  var f file

  var err error

  if err = yaml.Unmarshal(input, &f); err != nil {

    panic(err)

  }

  var out []byte

  if out, err = yaml.Marshal(&f.Sample); err != nil {

    panic(err)

  }

  fmt.Println(string(out))

}

这打印


some: # want

    complex: # comments

      - struct # included

它通过将结构存储到 a中来工作yaml.Node,它确实存储了评论。然后它将节点呈现为独立的 YAML 文档。


您可以通过浏览节点结构来访问评论。


该字符串与原始字符串不同,因为 YAML 在加载时总是会丢失一些信息。如果您需要以精确间距获取值,则确实需要将子树编码为文字块标量,就像您在答案中显示的那样。


查看完整回答
反对 回复 2022-06-21
?
LEATH

TA贡献1936条经验 获得超6个赞

我通过sample在 yaml 中定义为字符串来修改我的方法:


type: default

description: test data

sample: |

  some: # want

    complex: # comments

    - struct # included

这更像是一种解决方法,但是一个简单的...


查看完整回答
反对 回复 2022-06-21
  • 2 回答
  • 0 关注
  • 135 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信