Rumah > pembangunan bahagian belakang > Golang > Bagaimana cara unmarshal menaip alias di dalam struct dari yaml dalam golang?

Bagaimana cara unmarshal menaip alias di dalam struct dari yaml dalam golang?

王林
Lepaskan: 2024-02-06 08:57:08
ke hadapan
624 orang telah melayarinya

如何从 golang 中的 yaml 中解组结构内的类型别名?

Isi soalan

Saya nak yaml berikut

kind: bar
name: baryaml
Salin selepas log masuk

Unmarshalling dalam sumber struktur

type kind int

const (
    kind_foo kind = iota
    kind_bar
)

type resource struct {
    kind kind
    name string
}
Salin selepas log masuk

Bolehkah seseorang menerangkan mengapa kod di bawah gagal menyimpan jenis yang betul, walaupun ia dibongkar dengan betul?

# output:
unmarshaled kind: 1
yamlbar: {0 baryaml}
Salin selepas log masuk
# expected output:
unmarshaled kind: 1
yamlbar: {1 baryaml}
Salin selepas log masuk
package main

import (
    "fmt"

    "gopkg.in/yaml.v3"
)

type Kind int

const (
    KIND_FOO Kind = iota
    KIND_BAR
)

func (k *Kind) UnmarshalYAML(value *yaml.Node) error {
    var kind string
    err := value.Decode(&kind)

    if err != nil {
        return err
    }

    var x Kind

    switch kind {
    case "foo":
        x = KIND_FOO
    case "bar":
        x = KIND_BAR
    default:
        return fmt.Errorf("unknown kind: %s", kind)
    }

    k = &x
    fmt.Println("Unmarshaled kind:", *k)
    return nil
}

type Resource struct {
    Kind Kind
    Name string
}

func main() {

    var yamlBar = `
kind: bar
name: baryaml
`
    r := Resource{}
    err := yaml.Unmarshal([]byte(yamlBar), &r)

    if err != nil {
        panic(err)
    }

    fmt.Println("yamlBar:", r)
}

Salin selepas log masuk


Jawapan betul


Terima kasih kepada @jimb kerana mencadangkan penyahrujukan k Penunjuk:

func (k *Kind) UnmarshalYAML(value *yaml.Node) error {
    var kind string
    err := value.Decode(&kind)

    if err != nil {
        return err
    }

    switch kind {
    case "foo":
        *k = KIND_FOO
    case "bar":
        *k = KIND_BAR
    default:
        return fmt.Errorf("unknown kind: %s", kind)
    }

    fmt.Println("Unmarshaled kind:", *k)
    return nil
}
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana cara unmarshal menaip alias di dalam struct dari yaml dalam golang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan