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

我正在尝试制作一个非常简单的 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 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

}


不负相思意
浏览 644回答 2
2回答

浮云间

想通了,问题是我的缓冲区太大了。如果您的 []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}它按预期工作。

冉冉说

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

相关分类

Go