2017-12-21 12 views
1

i-Struktur haben, die verantwortlich Daten aus yaml Datei zu analysieren Während diese Struktur manchmal arbeitet ich einige neu Felder bekam, die ichBaukonstruktion tief Struktur funktioniert nicht

Dies funktioniert

analysieren müssen
- name: test1 
    type: type 
    path: path 

Dies ist nicht

- name: test1 
    type: type 
    path: path 
    build-parameters: 
     maven-opts: 
      defines: 
       skipTests: true 

Dies ist die Struktur

type Modules struct { 
    Name string 
    Type string 
    Path string 
    Parameters Parameters `yaml:"build-parameters,omitempty"` 
} 

und die Parameter sind Typ:

type Parameters map[string]string 

Wie ich meine Struktur konstruieren sollte auch diese Build-Parameter Eingaben zu übernehmen?

Dies ist die Bibliothek, die ich

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

Antwort

1

Ihre Struktur der Datenstruktur entspricht nicht verwenden. Wenn Parameters ein map[string]string ist, akzeptiert es Schlüssel/Wert-Paare, bei denen der Schlüssel und der Wert beide string sind. In Ihren Daten enthält build-parameters ein Objekt, das ein Objekt enthält, das ein Schlüssel/Wert-Paar enthält.

Sie könnte entweder Parameters neu definieren map[string]interface{} und Behauptungen verwenden Typ zu sein, oder Sie können die gesamte Struktur definieren, zB:

type Parameters struct { 
    MavenOpts struct { 
     Defines map[string]string 
    } `yaml:"maven-opts"` 
} 

Wenn Sie die leere Schnittstelle verwenden, werden Sie Typ Behauptungen verwenden müssen, das kann ziemlich umständlich werden. Zum Beispiel:

if opts, ok := module.Parameters["maven-opts"].(map[string]interface{}); ok { 
    if defines,ok := opts["defines"].(map[string]interface{}); ok { 
     if skipTests,ok := defines["skipTests"].(bool); ok { 
      // skipTests is the bool value from the yaml 
     } 
    } 
} 
+0

Vielen Dank, 1+ können Sie bitte auch die z. mit der Schnittstelle ('map [string] interface {}') und wie ich die Daten daraus als Antwort bekommen soll, jetzt wählt seine Maven und Build Parameter, aber es kann irgendwelche Werte mit dieser Struktur sein .... 'MavenOpts' on Ihr Beispiel ist Hardcode und kann einen beliebigen Wert haben ... –

+0

Typ-Assertions sind gut dokumentiert [in der Tour] (https://tour.golang.org/methods/15) und [in der Spezifikation] (https://golang.org/ref/spec#Type_assertions). – Adrian

+0

mein größter Mangel an Wissen hier, dass, wenn ich die 'map [string] Schnittstelle {}', wie sollte ich zugreifen, um den Wert zu finden, z. für 'skipTests' ... –

Verwandte Themen