为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
不负相思意 2021-11-22 16:10:04
我正在尝试制作一个非常简单的 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

}

它按预期工作。


查看完整回答
反对 回复 2021-11-22
?
冉冉说

TA贡献1877条经验 获得超1个赞

从它的声音来看,您在https://github.com/go-yaml/yaml/blob/53feefa2559fb8dfa8d81baad31be332c97d6c77/readerc.go#L347 上遇到了错误块,看起来这也应该告诉您偏移量(在文件中它遇到有问题的字符)和字符代码。如果这些信息足以解决您的问题,那就太好了。另一方面,如果 yaml 库吐出经过验证的 yaml,它不适合接受作为输入,您应该在https://github.com/go-yaml/yaml/issues上向 Github 上的维护者提出问题

查看完整回答
反对 回复 2021-11-22
  • 2 回答
  • 0 关注
  • 643 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信