Maison > développement back-end > Golang > le corps du texte

Balises personnalisées YAML dans Go

WBOY
Libérer: 2024-02-10 10:18:08
avant
885 Les gens l'ont consulté

Go 中的 YAML 自定义标签

l'éditeur php Banana vous présente les balises personnalisées YAML en langage Go. YAML est un format léger de sérialisation de données et le langage Go, en tant que langage de programmation puissant, prend naturellement en charge YAML. Dans Go, nous pouvons définir la structure des données YAML via des balises personnalisées pour mieux analyser et traiter les données YAML. En utilisant des balises personnalisées, nous pouvons facilement mapper les données YAML aux structures dans Go pour obtenir un traitement des données plus flexible et plus pratique. Ce qui suit présente en détail l'utilisation et les précautions des balises personnalisées YAML dans Go.

Contenu de la question

J'ai ces structures imbriquées en cours et j'ai ajouté des balises personnalisées à leurs propriétés,

type dummyparams struct {
  param1 string `yaml:"param1"`
  param2 string `yaml:"param2"`
}

type dummy struct {
  name string `yaml:"name"`
  type string `yaml:"type"`
  params dummyparams `yaml:"params"`
}
Copier après la connexion

J'ai créé des instances factices et les ai ajoutées à la tranche,

dummies := make([]dummy, 0)
dummy1 := dummy {
    name: "a"
    type: "type a"
    params: dummyparams {
        param1: "foo"
        param2: "bar"
    }
}
dummies = append(dummies, dummy1)
dummy2 := dummy {
    name: "b"
    type: "type b"
    params: dummyparams {
        param1: "foo"
        param2: "bar"
    }
}
dummies = append(dummies, dummy2)
Copier après la connexion

Enfin, j'organise les données et je les écris dans un fichier

yamlData, err := yaml.Marshal(&dummies)
// handle error ...
writeErr := os.WriteFile("foo.yaml", yamlData, 0644)
// handle write error ...
Copier après la connexion

Mais le yaml que je reçois n'a pas de noms de balises en minuscules mais des noms de structure en majuscules. Est-ce que quelqu'un sait pourquoi cela se produit et comment y remédier ?

Solution de contournement

La faute à l'implémentation yaml que vous utilisez. Par exemple, si vous utilisez gopkg.in/yaml.v3 ,它就可以工作。在 go playground 上尝试一下。因此,一种解决方案是使用另一种 yaml 实现,例如 gopkg.in/yaml.v3.

Vous avez mentionné dans les commentaires que vous utilisez https:///pkg.go.dev/sigs.k8s.io/[email protected]. La documentation de son package dit :

En bref, cette bibliothèque utilise d'abord go-yaml pour convertir yaml en json, puis utilise json.marshaljson.unmarshal 与结构进行转换。这意味着它有效地重用了 json 结构标签以及自定义 json 方法 marshaljsonunmarshaljson , ce qui est différent de go-yaml.

Alors sigs.k8s.io/<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="2c554d41406c5a1d021f021c">[email protected]</a> 第一个编组到 json。如果您想要小写的字段名称,请使用 json 标签而不是 yamlTag :

import "sigs.k8s.io/yaml"

type dummyparams struct {
    param1 string `json:"param1"`
    param2 string `json:"param2"`
}

type dummy struct {
    name   string      `json:"name"`
    type   string      `json:"type"`
    params dummyparams `json:"params"`
}
Copier après la connexion

Avec ce changement, la sortie contient des noms en minuscules (essayez-le sur le go Playground) :

- name: a
  params:
    param1: foo
    param2: bar
  type: type a
- name: b
  params:
    param1: foo
    param2: bar
  type: type b
Copier après la connexion

Veuillez noter que le tag json 标签而不是 yaml 才能使其工作只是 sigs.k8s.io/<a href="/cdn-cgi/l/email-protection" class="__cf_email__" 的一个怪癖data-cfemail="047d6569684472352a372a34">[电子邮件受保护]</a> 包。如果您想让它与这个包和其他yaml实现一起使用,您可以提供两者 jsonyaml doit être utilisé :

type DummyParams struct {
    Param1 string `json:"param1" yaml:"param1"`
    Param2 string `json:"param2" yaml:"param2"`
}

type Dummy struct {
    Name   string      `json:"name" yaml:"name"`
    Type   string      `json:"type" yaml:"type"`
    Params DummyParams `json:"params" yaml:"params"`
}
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!

Étiquettes associées:
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