Maison > développement back-end > Golang > Comment désorganiser l'alias de type à l'intérieur de la structure de yaml dans Golang ?

Comment désorganiser l'alias de type à l'intérieur de la structure de yaml dans Golang ?

王林
Libérer: 2024-02-06 08:57:08
avant
641 Les gens l'ont consulté

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

Contenu de la question

Je veux le yaml suivant

kind: bar
name: baryaml
Copier après la connexion

Démarrage dans la ressource de structure

type kind int

const (
    kind_foo kind = iota
    kind_bar
)

type resource struct {
    kind kind
    name string
}
Copier après la connexion

Quelqu'un peut-il expliquer pourquoi le code ci-dessous ne parvient pas à stocker le type correct, même s'il n'est pas correctement trié ?

# output:
unmarshaled kind: 1
yamlbar: {0 baryaml}
Copier après la connexion
# expected output:
unmarshaled kind: 1
yamlbar: {1 baryaml}
Copier après la connexion
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)
}

Copier après la connexion


Bonne réponse


Merci à @jimb d'avoir suggéré le déréférencement k Pointeur :

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
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal