【问题标题】:Go: How Do I Preserve Root Indentation in yaml?Go:如何在 yaml 中保留根缩进?
【发布时间】:2020-08-05 11:10:44
【问题描述】:

我在使用 go 和 yaml.v3 重新编码 YAML 文件时遇到问题。 基本上我有一个根缩进为 6 的 YAML 文件(根缩进 6 个空格)。

我需要读取这个文件,然后操作一些值并重写文件,但是在将 YAML 结构重写到文件时,我失去了这个缩进。 知道如何实现这一目标吗?否则我可能会将文件作为文本文件重新读取并添加缩进。

下面是我正在使用的代码。

YAML 文件摘录:

      doc:
        a: 'default'
        b: 42
        c: 3
        structure: 'flat'

     
      use_timezone: ''
      kafka_nodes: 3
      

解析 YAML 文件并写回文件

var ymlConfig yaml.Node
err = yaml.Unmarshal([]byte(pullConfig()), &ymlConfig)
//code ommited for brievity (some value verification and modification)

file, err := os.OpenFile("config.yml", os.O_WRONLY, os.ModeAppend)
if err != nil {
    panic(err)
}
defer file.Close()

d := yaml.NewEncoder(file)
d.SetIndent(4)// tried changing the indent but it does not change the root
defer d.Close()


if err := d.Encode(&ymlConfig); err != nil {
    panic(err)
}

重新编码的结果

doc:
  a: 'default'
  b: 42
  c: 3
  structure: 'flat'

     
use_timezone: ''
kafka_nodes: 3
      

【问题讨论】:

  • 来自pkg.go.dev/gopkg.in/yaml.v3?tab=doc - 值得注意的是,尽管 Node 提供了对行号、列和 cmets 等详细信息的访问,但 “重新编码后的内容将没有其原始文本表示保存。”
  • 是的,我看到了文档上的信息,但这并没有回答我最初的问题,我不是在问图书馆为什么这样做,而是我如何规避这种行为;默认情况下我有同样的问题,它没有保留,我在pythonruamel 中遇到了问题,通过使用转换选项,我设法保持输出缩进,因为它最初的意图
  • @ufasoli 你必须实现一个自定义的io.Writer,编码到这个 writer,然后操作它的内容,然后把它写到一个文件中

标签: go yaml indentation


【解决方案1】:

你可以做这么简单的事情。

package main

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

func addRootIndent(b []byte, n int) []byte {
    prefix := append([]byte("\n"), bytes.Repeat([]byte(" "), n)...)
    b = append(prefix[1:], b...)  // Indent first line
    return bytes.ReplaceAll(b, []byte("\n"), prefix)
}

func main() {
    t := struct {
        Doc map[string]interface{}
    } {
        Doc: map[string]interface{}{
            "a": "The meaning is...",
            "b": 42,
        },
    }

    b, _ := yaml.Marshal(t)
    b = addRootIndent(b, 6)

    fmt.Println(string(b))
}

要更改 yaml 文档中的缩进,请使用

func (e *Encoder) SetIndent(spaces int)

【讨论】:

  • 哦,这很好,我开始以类似的方式开始,但它没有这样优雅,谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-06-10
  • 2018-06-06
  • 2016-02-11
  • 1970-01-01
  • 2011-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多