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

Go 将结构解组为包含注释的字符串,go,yaml,Go,Yaml,我想部分读取yaml,即解码类型/描述码,但将示例码(定义结构)保留为普通字符串。目的是定义用于解码的测试数据集 例如: type: default description: test data sample: some: # want complex: # comments - struct # included 我希望sample的子键作为普通字符串返回 我已尝试将别名类型与解组器接口gopkg.in/yaml.v2一起使用: 但最后: panic: yaml: unm

我想部分读取yaml,即解码类型/描述码,但将示例码(定义结构)保留为普通字符串。目的是定义用于解码的测试数据集

例如:

type: default
description: test data
sample:
  some: # want
    complex: # comments
    - struct # included
我希望sample的子键作为普通字符串返回

我已尝试将别名类型与解组器接口gopkg.in/yaml.v2一起使用:

但最后:

panic: yaml: unmarshal errors:
  line 4: cannot unmarshal !!map into []uint8

我找不到一种简单的方法来实现这一点,无论是使用解组yaml和自定义字符串类型还是强制转换为字符串?

我已经修改了我的方法,在yaml中将sample定义为字符串:

type: default
description: test data
sample: |
  some: # want
    complex: # comments
    - struct # included

这更像是一种解决办法,但很简单……

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

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

包干管 进口 fmt gopkg.in/yaml.v3 类型文件结构{ 类型字符串 描述字符串 示例yaml.Node } 变量输入[]字节=[]字节` 类型:默认值 描述:测试数据 样本: 一些人:想要 综合体:评论 -包含结构 ` func main{ var f文件 变量错误 如果err=yaml.Unmarshalinput,&f;err!=nil{ 圆锥花序 } var out[]字节 如果输出,err=yaml.Marshal&f.Sample;err!=nil{ 圆锥花序 } 打印输出 } 这张照片

一些人:想要 综合体:评论 -包含结构 它通过将结构存储到yaml.Node中来工作,yaml.Node确实存储注释。然后将节点呈现为独立的YAML文档

您可以通过遍历节点结构来访问注释


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

请包括一个示例输入yaml,并指出您想要的结果。同时发布您到目前为止尝试过的内容以及您正在使用的yaml库。对于不清楚的问题,抱歉,请按要求展开。最好使用yaml解析器而不是模式匹配
type: default
description: test data
sample: |
  some: # want
    complex: # comments
    - struct # included