Как изменить поле yaml в go, если я не знаю все возможные поля в yaml? - PullRequest
0 голосов
/ 25 сентября 2019

Как я могу изменить поле в yaml, если я не знаю всех возможных полей, которые может иметь yaml?Я не могу определить структуру, которая имеет все возможные поля, и gopkg.in/yaml.v2 Unmarshall игнорирует поля, которых нет в предоставленной структуре, поэтому Marshall теряет все поля, отсутствующие в структуре, что недопустимо.

Есть ли пакет, который позволит мне динамически указывать имя поля, которое будет либо возвращать базовое значение, либо структуру, если поле существует, и nil / err в противном случае?И как меняются мои изменения при сохранении всех других полей из ввода yaml?

Спасибо, Пол

Ответы [ 2 ]

0 голосов
/ 26 сентября 2019

Догадываясь, как выглядит ваш YAML, основываясь на вашем ответе, возможно, что-то вроде этого сработает:

//
// a map (string index) of map (string index) of a string slice
//
type mystruct map[string]map[string][]string

//
// guessing what your YAML looks like:
//
wccYAML = `
extensions:
  scriptURLs:
    - 'https://localhost:9000'
    - 'https://localhost:9001'
    - 'https://localhost:9002'
`

Детская площадка: https://play.golang.org/p/wvkr2pFk-0j

Обычно нужно избегать использования interface{}как вы видели, кастинг очень быстро запутывается.

0 голосов
/ 26 сентября 2019

Unmarshalling с map[interface{}]interface{} сделал трюк:

            wcc := make(map[interface{}]interface{})
            err := yaml.Unmarshal([]byte(wccString), &wcc)

Нотация для доступа к структуре yaml не является интуитивно понятной (для меня), но я в конце концов нашел заклинание, которое работает:

wcc["extensions"].(map[interface{}]interface{})["scriptURLs"].([]interface{})[2] = "https://192.168.0.3:8080/..."
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...