2017-12-20 28 views
2

yamlsファイルをオブジェクト(structs)に解析するプログラムがあります。 私は私が持っているファイルで、それを例えば繰り返し構造体を構築する方法

https://github.com/go-yaml/yaml

を行うには、次のレポを使用します。

dependency : 
    - name: ui 
    type: runner 
    cwd: /ui 
    install: 
     - name: api 
     group: test 

そして、私は今それ

type Dependency struct { 
    Name  string 
    Type  string 
    CWD  string 
    Install []Install 
    //here I have the issue 
    Requires ? 
} 

type Install struct { 
    Name  string 
    Group  string 
} 

については、以下の構造体を使用し、私は少し複雑な構造体で2つの問題が2つあります。

これはDependency構造体の内側にある可能性がエントリであり、これはそれがYAMLファイルで

requires: 
     - name: db 
     - type: mongo 

を見てどのようであるが、それは、複数の名前のプロパティを持っているので、それはまた

requires: 
     - name: db 
     - name: rst 
     - name: test 
     - name: test2 

することができどのようにこの構造体を構築する必要がありますか

さらに私はyamlにフィールドを持っています

_type-version: "1.0.0"

私は次のような構造体の内側にそれを置くとき、私はこれを克服する方法-

type TypeVer struct{ 
    _Type-version string 
} 

を使用するので、私はエラーを得ましたか?

答えて

2

yamlパッケージで実際にプロパティの名前を再マップすることができます。これを使用して_type-versionプロパティを処理できます。 そして、あなたの最初の質問:ちょうどInstallと同じRequiresを定義します。

package main 

import (
    "fmt" 
    "log" 

    "github.com/go-yaml/yaml" 
) 

type File struct { 
    TypeVersion string `yaml:"_type-version"` 
    Dependency []Dependency 
} 

type Dependency struct { 
    Name  string 
    Type  string 
    CWD  string 
    Install []Install 
    Requires []Requires 
} 

type Install struct { 
    Name string 
    Group string 
} 

type Requires struct { 
    Name string 
    Type string 
} 

var data = ` 
_type-version: "1.0.0" 
dependency: 
    - name: ui 
    type: runner 
    cwd: /ui 
    install: 
     - name: api 
     group: test 
    requires: 
     - name: db 
     - type: mongo 
     - name: rst 
     - name: test 
     - name: test2 
` 

func main() { 
    f := File{} 

    err := yaml.Unmarshal([]byte(data), &f) 
    if err != nil { 
     log.Fatalf("error: %v", err) 
    } 
    fmt.Printf("--- t:\n%v\n\n", f) 

    d, err := yaml.Marshal(&f) 
    if err != nil { 
     log.Fatalf("error: %v", err) 
    } 
    fmt.Printf("--- t dump:\n%s\n\n", string(d)) 
} 
+0

たくさん私は今それをチェックして、質問を閉じますありがとうございました。あなたが 'name'や' group'のような2つのconstプロパティを持っていることを知っている 'install'のような構造体を持っていると仮定しますが、変更可能な追加のvalプロパティを持つことができます。あなたはこの構造体を定義しますか?考え方はyamlファイルを読み込んでいくつかの値を変更し、それをfsに書き戻すことです。ありがとう! –

+0

特定の値を変更して他のものをそのまま残しておきたい場合は、型を使用しない方がよいかもしれません。代わりに 'map [interface {}] interface {}'を使用してください。この種の構造のナビゲートはもう少し作業ですが、予期しないプロパティの準備ができています。 –

+0

あなたの答えに追加することができれば幸いです。どのように見えるか。サポートありがとう! –

関連する問題