Maison  >  Article  >  développement back-end  >  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 ?

王林
王林avant
2024-02-06 08:57:08598parcourir

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

Contenu de la question

Je veux le yaml suivant

kind: bar
name: baryaml

Démarrage dans la ressource de structure

type kind int

const (
    kind_foo kind = iota
    kind_bar
)

type resource struct {
    kind kind
    name string
}

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}
# expected output:
unmarshaled kind: 1
yamlbar: {1 baryaml}
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)
}


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
}

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer
Article précédent:ent-go o2m upsert copieArticle suivant:ent-go o2m upsert copie