Как отключить golang yaml v3 с полным доступом к узлу - PullRequest
0 голосов
/ 31 мая 2019

Я пытаюсь научиться использовать unamrshaling yaml v3 с полным доступом к узлу в сложной встроенной структуре.

В сообщении объясняется, как использовать yaml.Node, ноне дает серьезного примера.И документы также не показывают работу с узлом.Кажется, что основной целью является отличное сохранение комментариев в файлах yaml.

Например, при работе с расширением статьи анонса у меня есть

package main

import(
    "fmt"
    "gopkg.in/yaml.v3"
    "os"
)

func main() {

    type Person struct {
        Name    string
        Address yaml.Node
    }

    data := `
name: John Doe
address: 
    street: 123 E 3rd St # street is like an avenue
    city: Denver  # A city might be a town as well
    state: CO  # A state might be a province or administrative unit
    zip: 81526 # zip might be "postal_code"
`

    var person Person
    err := yaml.Unmarshal([]byte(data), &person)
    if (err != nil) {
        fmt.Printf("Failed to unmarshall: %v", err)
        os.Exit(1)
    }
    fmt.Printf("Marshalled person=%v", person)

}

Но если я попытаюсь использоватьэлементы адреса, я нахожу их перечисленными в виде массива содержимого внутри узла;Там нет никакой полезной информации.Здесь есть комментарии, но неясно, с чем они связаны.

Изменить существующий файл yaml и добавить новые данные и комментарии также имеет дело с той же территорией, но непоказать навигацию по структуре после демаршаллинга в структуру.

Как я могу перемещаться по узлу «Адрес», когда он не маршалируется, и сохранять комментарии к маршаллингу снова?

1 Ответ

0 голосов
/ 01 июня 2019

Вы должны объявить полную struct вместо использования yaml.Node

package main

import (
    "fmt"
    "gopkg.in/yaml.v3"
    "os"
)

func main() {
    type Address struct {
        Street string
        City   string
        State  string
        Zip    string
    }
    type Person struct {
        Name    string
        Address Address
    }



data := `
    name: John Doe
    address: 
        street: 123 E 3rd St
        city: Denver
        state: CO
        zip: 81526
    `

    var person Person
    err := yaml.Unmarshal([]byte(data), &person)
    if (err != nil) {
        fmt.Printf("Failed to unmarshall: %v", err)
        os.Exit(1)
    }
    fmt.Printf("Marshalled person=%v", person)
}

yaml.Node выглядит как промежуточное представление. Он должен быть декодирован для получения значений.

package main

import (
    "fmt"
    "gopkg.in/yaml.v3"
    "os"
)

func main() {
    type Address struct {
        Street string
        City   string
        State  string
        Zip    string
    }
type Person struct {
    Name    string
    Address yaml.Node
}

data := `
name: John Doe
address: 
    street: 123 E 3rd St
    city: Denver
    state: CO
    zip: 81526
`

var person Person
err := yaml.Unmarshal([]byte(data), &person)
if (err != nil) {
    fmt.Printf("Failed to unmarshall: %v", err)
    os.Exit(1)
}
address := &Address{}
_ = person.Address.Decode(address)
fmt.Printf("Marshalled person=%v\n %v", person, *address)

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