Go-yaml 控制字符不允许错误

Ino*_*dle 3 yaml go

我正在尝试制作一个非常简单的 ssh 地址簿程序。获取有关 ssh 地址的一些信息并将它们存储在 yaml 文档中。我这样做的部分原因是为了学习一些关于 Go 的知识,但遇到了一个小问题。我可以序列化数据并将文档放入文件中,但是当我尝试读回它时出现此错误:
yaml: control characters are not allowed

我不确定此错误消息的含义,谷歌搜索没有产生任何有用的结果。有任何想法吗?

这些是我用来组织数据的结构:

type EntriesList struct {
    SSHEntries []SSHEntry `yaml:"sshentries"`
}   

type SSHEntry struct {
    Name    string `yaml:"name"`
    Command SSHCmd `yaml:"command"`
}   

type SSHCmd struct {
    Addr  string `yaml:"addr"`
    Port  int    `yaml:"port"`
    Uname string `yaml:"uname"`
}   
Run Code Online (Sandbox Code Playgroud)

它将我的数据放入的格式是:

---
entrieslist:
 - name: entry1
   command:
     addr: somewhere
     port: 22
     uname: someone
 - name: entry2 ... etc 
Run Code Online (Sandbox Code Playgroud)

我用 YAML 验证器检查了这个 ^^,它是合法的 YAML。这是我读取文件的函数:

// CONF is the path to the file
func readConf(CONF string) *EntriesList {
    configFile := openConfigFile(CONF)
    defer configFile.Close()

    buffer := make([]byte, 512, 512)
    _, err := configFile.Read(buffer)
    check(err)

    var entries EntriesList
    err = yaml.Unmarshal(buffer, &entries)
    data, _ := yaml.Marshal(entries)
    fmt.Println(string(data))

    return &entries
}
Run Code Online (Sandbox Code Playgroud)

Ino*_*dle 5

想通了,问题是我的缓冲区太大了。如果您的 []byte 太大,那么 go-yaml 会将这些额外的字节读取为字符并抛出错误。我将代码更改为:

func readConf(CONF string) *EntriesList {
    confiFile, err := ioutil.ReadFile(CONF)
    check(err)
    var entries EntriesList
    err = yaml.Unmarshal(confiFile, &entries)
    check(err)
    return &entries
}
Run Code Online (Sandbox Code Playgroud)

它按预期工作。