为什么golang yaml头注释在解组后变成脚注释

问题描述 投票:1回答:1

我正在下面的一个非常简单的代码中使用HeadComment进行测试:

package main

import (
    "fmt"
    "gopkg.in/yaml.v3"
)

type Person struct {
    Name *yaml.Node
}

func main() {
    nameNode := &yaml.Node{
        Kind:        yaml.ScalarNode,
        HeadComment: "The name of a person",
        Value:       "Lily",
        Style: yaml.DoubleQuotedStyle,
    }

    person := Person{
        Name: nameNode,
    }

    dataInBytes, _ := yaml.Marshal(person)
    fmt.Println(string(dataInBytes))
}

我希望看到这样的输出:

# The name of a person
name: "Lily"

但是,我得到了:

name: "Lily"
# The name of a person

头评论变成脚评论。有人有想法吗?谢谢!

https://play.golang.org/p/10bQt2KTKBU

go yaml
1个回答
0
投票

我认为是因为该主注释位于附加到值节点的YAML文档树中(不是name:,而是"Lily")。

因此,在发出事件时,该注释实际上属于:

name: "Lily"
     ^-- here

go-yaml将标题注释的值放在对的末尾有点有意义。我将其称为实现而不是预期的行为,因此,您已经与库的作者一起打开了一张票,以查看他们是否要更改实现以将value对中的key: value的主注释移至位置,这是一个好习惯。而是使用key的标题注释(我同意,特别是在用于封送struct的情况下,这很有意义并且更方便)。

这里是一个示例代码,它创建相同的结构并将头注释添加到name:标量以获取正确的呈现效果(但会损失漂亮的结构):

func main() {
        key := &yaml.Node{
                Kind:        yaml.ScalarNode,
                Value:       "name",
                HeadComment: "The name of a person",
        }
        value := &yaml.Node{
                Kind:  yaml.ScalarNode,
                Value: "Lilly",
                Style: yaml.DoubleQuotedStyle,
        }

        mapping := &yaml.Node{
                Kind:    yaml.MappingNode,
                Content: []*yaml.Node{key, value},
        }

        dataInBytes, _ := yaml.Marshal(mapping)
        fmt.Println(string(dataInBytes))
}

输出:

# The name of a person
name: "Lilly"
© www.soinside.com 2019 - 2024. All rights reserved.