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
684 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!

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