Mam następującą strukturę Yaml:

type YamlConfig struct {
    Items struct {
        RiskyRoles []struct {
            Name string `yaml:"name"`
            Rules []struct{
                Verbs []string `yaml:"verbs"`
                ResourceOperator string `yaml:"resourcesOperator"`
                Resources []string `yaml:"resources"`
            }
        } `yaml:"RiskyRoles"`
    } `yaml:"Items"`
}  

Mam funkcję, która analizuje plik yaml do obiektu, a następnie chcę wysłać obiekt struktury Rules do funkcji o nazwie DoingStuff(..):

yamlFile, err := ioutil.ReadFile("actionItems.yaml")
if err != nil {
    fmt.Printf("Error reading YAML file: %s\n", err)
} else{
    var yamlConfig YamlConfig
    err = yaml.Unmarshal(yamlFile, &yamlConfig)
    if err != nil {
        fmt.Printf("Error parsing YAML file: %s\n", err)
    }

    for _, yamlRole := range yamlConfig.Items.RiskyRoles{
       DoingStuff(yamlRole.Rules)
    }
}

Ale wewnątrz funkcji DoingStuff, obiekt struct Rules nie jest rozpoznawany:

func DoingStuff(yamlRules []struct{}) {
  // Not recognize ****
  for _, rule := range yamlRules {
      fmt.Print(rule.ResourceOperator)
  }
}

Jak mogę go przekonwertować na:

Rules []struct{
    Verbs []string `yaml:"verbs"`
    ResourceOperator string `yaml:"resourcesOperator"`
    Resources []string `yaml:"resources"`
}

Czy powinienem ponownie zadeklarować ten struct? Lub obsada za pomocą interfejsów?

EDYTUJ:

Dodałem nowy struktura i użyłem go wewnątrz struktury YamlConfig, ale parse nie powiodło się, aby przeanalizować reguły:

type RulesStruct struct {
    Rules []struct{
        Verbs []string `yaml:"verbs"`
        ResourceOperator string `yaml:"resourcesOperator"`
        Resources []string `yaml:"resources"`
    }
}
type YamlConfig struct {
    Items struct {
        RiskyRoles []struct {
            Name string `yaml:"name"`
            Message string `yaml:"message"`
            Priority string `yaml:"priority"`
            Rules []RulesStruct
        } `yaml:"RiskyRoles"`
    } `yaml:"Items"`
}
0
E235 20 styczeń 2020, 16:51

1 odpowiedź

Najlepsza odpowiedź

Dzięki pomocy @MKPoriva zmieniłem takie struktury:

type RulesStruct struct {

    Verbs []string `yaml:"verbs"`
    ResourceOperator string `yaml:"resourcesOperator"`
    Resources []string `yaml:"resources"`

}

type YamlConfig struct {
    Items struct {
        RiskyRoles []struct {
            Name string `yaml:"name"`
            Message string `yaml:"message"`
            Priority string `yaml:"priority"`
            Rules []RulesStruct
        } `yaml:"RiskyRoles"`
    } `yaml:"Items"`
}  

Teraz działa dobrze.

1
E235 20 styczeń 2020, 14:03