我正在尝试制作一个非常简单的 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"`} 它将我的数据放入的格式是:---entrieslist: - name: entry1 command: addr: somewhere port: 22 uname: someone - name: entry2 ... etc 我用 YAML 验证器检查了这个 ^^,它是合法的 YAML。这是我读取文件的函数:// CONF is the path to the filefunc 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}
2 回答
浮云间
TA贡献1829条经验 获得超4个赞
想通了,问题是我的缓冲区太大了。如果您的 []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
}
它按预期工作。
冉冉说
TA贡献1877条经验 获得超1个赞
从它的声音来看,您在https://github.com/go-yaml/yaml/blob/53feefa2559fb8dfa8d81baad31be332c97d6c77/readerc.go#L347 上遇到了错误块,看起来这也应该告诉您偏移量(在文件中它遇到有问题的字符)和字符代码。如果这些信息足以解决您的问题,那就太好了。另一方面,如果 yaml 库吐出经过验证的 yaml,它不适合接受作为输入,您应该在https://github.com/go-yaml/yaml/issues上向 Github 上的维护者提出问题
- 2 回答
- 0 关注
- 643 浏览
添加回答
举报
0/150
提交
取消