我正在尝试制作一个非常简单的 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)
想通了,问题是我的缓冲区太大了。如果您的 []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)
它按预期工作。