2016-08-27 6 views
0

2つのマップを含む構造体にYAMLファイルをアンマーシャリングしようとしています(go-yamlを使用)。マップで構造体にYAMLをアンマーシャリングする

YAMLファイル:

'Include': 
    - 'string1' 
    - 'string2' 

'Exclude': 
    - 'string3' 
    - 'string4' 

構造体:

type Paths struct { 
    Include map[string]struct{} 
    Exclude map[string]struct{} 
} 

アンマーシャルしよう関数の簡略化されたバージョン(すなわち除去エラー等の取り扱い):

import "gopkg.in/yaml.v2" 

func getYamlPaths(filename string) (Paths, error) { 
    loadedPaths := Paths{ 
     Include: make(map[string]struct{}), 
     Exclude: make(map[string]struct{}), 
    } 

    filenameabs, _ := filepath.Abs(filename) 
    yamlFile, err := ioutil.ReadFile(filenameabs) 

    err = yaml.Unmarshal(yamlFile, &loadedPaths) 
    return loadedPaths, nil 
} 

データはファイルから読み込まれていますが、unmarshal-functionは構造体に何も入れておらず、戻り値ですエラーなし。

私は、unmarshal-functionがYAMLコレクションをmap[string]struct{}にすることはできないと思っていますが、前述のようにエラーは発生せず、同様の問題を調べて見つけられないようです。

手がかりや洞察力があれば幸いです!

答えて

0

デバッグでは複数の問題が見つかりました。まず、yamlはフィールド名を気にしていないようです。あなたは

`yaml:"NAME"` 

YAMLファイルの2番目、IncludeExcludeの両方でフィールドに注釈を付けるを持っている文字列のリストだけではなく、マップのようなものが含まれています。したがって、あなたの構造体は:

type Paths struct { 
    Include []string `yaml:"Include"` 
    Exclude []string `yaml:"Exclude"` 
} 

となります。フルコード:

package main 

import (
    "fmt" 
    "gopkg.in/yaml.v2" 
) 

var str string = ` 
'Include': 
    - 'string1' 
    - 'string2' 

'Exclude': 
    - 'string3' 
    - 'string4' 
` 

type Paths struct { 
    Include []string `yaml:"Include"` 
    Exclude []string `yaml:"Exclude"` 
} 

func main() { 
    paths := Paths{} 

    err := yaml.Unmarshal([]byte(str), &paths) 

    fmt.Printf("%v\n", err) 
    fmt.Printf("%+v\n", paths) 
} 
+0

返信ありがとうございます!私はあなたがここで示唆したようにスライスを使用しようとしましたが、私はそれが構造体のタグの不足のために動作しなかったと仮定します。私が何か良いものを思いつくまで、私はロードされた後にそれらをマップに変えるだろうと思う! – henrheid

関連する問題