gpt4 book ai didi

go - Go:如何在yaml中保留根缩进?

转载 作者:行者123 更新时间:2023-12-01 22:11:35 24 4
gpt4 key购买 nike

使用go和yaml.v3重新编码YAML文件时遇到麻烦。
基本上我有一个YAML文件,其根缩进为6(根缩进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

最佳答案

您可以做这样简单的事情。

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 doc中的缩进,请使用
func (e *Encoder) SetIndent(spaces int)

关于go - Go:如何在yaml中保留根缩进?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63263936/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com