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

我想部分读取yaml,即解码Type/Description键,但将Sample定义结构的键-保留为纯字符串。目的是定义用于解码的测试数据集。


例子:


type: default

description: test data

sample:

  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自定义字符串类型或强制转换为字符串的简单方法?


至尊宝的传说
浏览 136回答 2
2回答

白板的微信

您应该知道,通过阅读评论,您违反了 YAML 规范,该规范明确规定评论不得传达内容信息。无论如何,go-yaml v3 提供了yaml.Node中间子结构的类型:package mainimport (  "fmt"  "gopkg.in/yaml.v3")type file struct {  Type string  Description string  Sample yaml.Node}var input []byte = []byte(`type: defaultdescription: test datasample:  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 在加载时总是会丢失一些信息。如果您需要以精确间距获取值,则确实需要将子树编码为文字块标量,就像您在答案中显示的那样。

LEATH

我通过sample在 yaml 中定义为字符串来修改我的方法:type: defaultdescription: test datasample: |  some: # want    complex: # comments    - struct # included这更像是一种解决方法,但是一个简单的...
打开App,查看更多内容
随时随地看视频慕课网APP