Unmarshal YAML возвращает неполный результат - PullRequest
0 голосов
/ 21 февраля 2020

Вход Yaml:

params: 
  - aws.region: ["us-west-1","us-west-2"]
  - aws.s3path: ["s3-path-1", "s3-path-2"]

Код:

package main

import (
    "fmt"
    "io/ioutil"
    "os"

    "gopkg.in/yaml.v2"
)

func main() {  
    var f File
    wfyaml, _ := os.Open("temp.yaml")
    byteValue, _ := ioutil.ReadAll(wfyaml)
    yaml.Unmarshal(byteValue, &f)
    fmt.Print(f)
}

type File struct {
    Params Params `yaml:"params"`
}

type Params []struct { // <<< This [] behavior is confusing
    AwsRegion []string `yaml:"aws.region"`
    S3path    []string `yaml:"aws.s3path"`
}

Выход:

{[{[us-west-1 us-west-2] []} {[] [s3-path-1 s3-path-2]}]}%   

Если я использую

type Params struct { // <<< This [] behavior is confusing
        AwsRegion []string `yaml:"aws.region"`
        S3path    []string `yaml:"aws.s3path"`
    }

Тогда вывод {{[] []}}%

Я не уверен, что я что-то здесь упускаю.

Ответы [ 2 ]

2 голосов
/ 21 февраля 2020

Это потому, что params из вашего входного yaml является массивом.

Если вы измените свой входной yaml на следующий, то вы обнаружите, что ваш код с type Params struct работает так, как вы ожидаете, потому что params больше не является массивом в этом случае.

params:
    aws.region: ["us-west-1","us-west-2"]
    aws.s3path: ["s3-path-1", "s3-path-2"]
1 голос
/ 21 февраля 2020

Поведение соответствует вводу YAML:

params: 
  - aws.region: ["us-west-1","us-west-2"]
  - aws.s3path: ["s3-path-1", "s3-path-2"]

Выше params является массивом, поскольку его элементы начинаются с -. Каждый - является элементом массива, а так как каждый элемент имеет ключ, param является массивом объектов. Первый элемент - это объект с ключом aws.region, а второй элемент - это объект с ключом aws.s3path. Эти объекты сами являются строковыми массивами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...