Существует два метода использования yaml.v3
и его функция комментариев:
- создание дерева
yaml.Node
вручную (утомительное обслуживание; точные обновления значений) - анализ aшаблон в дерево
yaml.Node
(простота обслуживания; сложность обновления)
Метод 1:
Создание дерева узла YAML вручную:
config = &yaml.Node{
Kind: yaml.DocumentNode,
Content: []*yaml.Node{
&yaml.Node{
Kind: yaml.MappingNode,
Content: []*yaml.Node{
&yaml.Node{
Kind: yaml.ScalarNode,
Value: "ec2",
HeadComment: "# This section is for EC2",
},
&yaml.Node{
Kind: yaml.ScalarNode,
Style: yaml.DoubleQuotedStyle,
Value: "", // <- field value goes here
},
&yaml.Node{
Kind: yaml.ScalarNode,
Value: "vpc",
HeadComment: "# This section is for VPC",
},
&yaml.Node{
Kind: yaml.ScalarNode,
Style: yaml.DoubleQuotedStyle,
Value: "", // <- field value goes here
},
},
},
},
}
Пример рабочей площадки: https://play.golang.org/p/Z6iw29rHZXk
Вывод:
# This section is for EC2
ec2: ""
# This section is for VPC
vpc: ""
Метод 2:
Прочитайте шаблон вашей схемы YAML, например,
var yamlSchema = []byte(`
# EC2 header-comment
ec2: ""
# This section is for VPC
vpc: ""
`)
, а затем проанализируйте его во время выполнения в дерево yaml.Node
, например:
var c yaml.Node
err := yaml.Unmarshal(yamlSchema, &c)
Но как дерево yaml.Node
- который имеет вложенный срез yaml.Node
с - вам нужно программно найти значения полей, поэтому, когда вы настраиваете конфигурацию для записи, значения соединяются с правильными полями.
Например, это может работает сегодня:
c.Content[0].Content[1].Value = ec2Value // dangerous
, но не завтра, когда схема изменится.
Обход карты и поиск поля val* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * [тогда, когда вы можете добавить ec2
и затем поместить его значение в соседний узел. *
# This section is for EC2
ec2: "" # <-- place user input here
# footer EC2
# This section is for VPC
vpc: ""