С другой стороны, если я использую (в данном случае) структуру [] yaml.Node, она действительно представляет все узлы внутри как yaml.Node или [] yaml.Node.
Это неточно. go -yaml позволяет вам оставить любое поддерево вашей структуры как yaml.Node
, возможно, для последующей обработки. Внутри этого узла все представлено как yaml.Node
, а узел, который является коллекцией (последовательностью или отображением), просто хранит свои дочерние элементы как []yaml.Node
. Но ни один узел не представлен напрямую как []yaml.Node
.
Когда вы десериализуете в []yaml.Node
, вы десериализуете узел верхнего уровня в собственную структуру (срез), оставляя дочерние элементы несформированными (процесс загрузки узел YAML в нативной структуре называется конструкция в spe c).
go -yaml на самом деле не поддерживает
type Document yaml.Node
, но если вы просто делаете
var d yaml.Node
комментарий также будет сохранен (toSlice
, очевидно, больше не будет работать):
- # Employee records
martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: Tabitha Bitumen
job: Developer
skills:
- lisp
- fortran
- erlang
Теперь, как мы видим, положение комментария отличается. Это потому, что go -yaml просто сохраняет в yaml.Node
, который представляет элемент списка, что «был комментарий перед этим элементом списка» . Информация о том, где именно находится комментарий, утеряна. Вы должны быть благодарны за то, что у вас есть любая информация о комментарии, потому что большинство реализаций YAML отбрасывают их намного раньше, поскольку spe c говорит, что комментарии не должны передавать информацию о содержимом.
Возможно, вы захотите для чтения Я хочу загрузить файл YAML, возможно, отредактировать данные, а затем снова сбросить его. Как сохранить форматирование? подробно описывает, почему, когда и как информация теряется во время загрузки файла YAML. TL; DR: Невозможно (без самостоятельного анализа) загрузить файл YAML и выгрузить его обратно с сохранением всего форматирования, и если это ваша цель, YAML - неподходящий инструмент для вас.