2015-11-15 19 views
1

我想做一個非常簡單的SSH通訊錄程序。獲取有關ssh地址的一些信息並將它們存儲在yaml文檔中。我在做部分工作是爲了瞭解一下Go,並且遇到一個小問題。我可以序列數據,並把文檔轉換成一個文件,但我得到這個錯誤,當我嘗試讀回:
yaml: control characters are not allowedGo-yaml控制字符是不允許的錯誤

我不知道這是什麼錯誤消息意味着,谷歌搜索並沒有屈服任何有用的結果。有任何想法嗎?

這是我使用來組織數據結構:

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 
} 

回答

2

想通了,問題在於我的緩衝區太大了。如果您的[]字節太大,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 
} 

它按預期工作。

+0

現貨!我通過'io.Reader'讀取了我的數據,所以我將緩衝區分割爲'[0:count]'(count是'Read'函數報告的字節數)。 –

1

從它的聲音,你打在https://github.com/go-yaml/yaml/blob/53feefa2559fb8dfa8d81baad31be332c97d6c77/readerc.go#L347錯誤塊,而且看起來也應該告訴你的偏移量(其中在文件它遇到了有問題的字符)和字符代碼。如果這個信息足以解決你的問題,那麼很好。另一方面,如果yaml庫正在吐出已驗證的yaml,並且它不習慣接受作爲輸入,則應該在Github上的維護人員處打開問題https://github.com/go-yaml/yaml/issues

相關問題