我正在下面的一个非常简单的代码中使用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
头评论变成脚评论。有人有想法吗?谢谢!
我认为是因为该主注释位于附加到值节点的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"