Benutzerdefinierte YAML-Tags in Go

WBOY
Freigeben: 2024-02-10 10:18:08
nach vorne
853 Leute haben es durchsucht

Go 中的 YAML 自定义标签

php-Editor Banana stellt Ihnen benutzerdefinierte YAML-Tags in der Go-Sprache vor. YAML ist ein leichtes Datenserialisierungsformat, und die Go-Sprache bietet als leistungsstarke Programmiersprache natürlich Unterstützung für YAML. In Go können wir die YAML-Datenstruktur durch benutzerdefinierte Tags definieren, um YAML-Daten besser zu analysieren und zu verarbeiten. Durch die Verwendung benutzerdefinierter Tags können wir YAML-Daten problemlos Strukturen in Go zuordnen, um eine flexiblere und bequemere Datenverarbeitung zu erreichen. Im Folgenden werden die Verwendung und Vorsichtsmaßnahmen von benutzerdefinierten YAML-Tags in Go ausführlich vorgestellt.

Frageninhalt

Ich habe diese verschachtelten Strukturen in go und habe benutzerdefinierte Tags zu ihren Eigenschaften hinzugefügt,

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"`
}
Nach dem Login kopieren

Ich habe einige Dummy-Instanzen erstellt und sie dem Slice hinzugefügt,

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)
Nach dem Login kopieren

Schließlich organisiere ich die Daten und schreibe sie in eine Datei

yamlData, err := yaml.Marshal(&dummies)
// handle error ...
writeErr := os.WriteFile("foo.yaml", yamlData, 0644)
// handle write error ...
Nach dem Login kopieren

Aber das Yaml, das ich bekomme, hat keine Tag-Namen in Kleinbuchstaben, sondern Strukturnamen in Großbuchstaben. Weiß jemand, warum das passiert und wie man es beheben kann?

Workaround

Schuld daran ist die Yaml-Implementierung, die Sie verwenden. Wenn Sie beispielsweise gopkg.in/yaml.v3 ,它就可以工作。在 go playground 上尝试一下。因此,一种解决方案是使用另一种 yaml 实现,例如 gopkg.in/yaml.v3 verwenden.

Sie haben in den Kommentaren erwähnt, dass Sie https:///pkg.go.dev/sigs.k8s.io/[email protected] verwenden. In der Paketdokumentation heißt es:

Kurz gesagt, diese Bibliothek verwendet zuerst go-yaml, um Yaml in JSON zu konvertieren, und verwendet dann json.marshaljson.unmarshal 与结构进行转换。这意味着它有效地重用了 json 结构标签以及自定义 json 方法 marshaljsonunmarshaljson, was sich von go-yaml unterscheidet.

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

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"`
}
Nach dem Login kopieren

Mit dieser Änderung enthält die Ausgabe Namen in Kleinbuchstaben (versuchen Sie es auf dem go-Spielplatz):

- name: a
  params:
    param1: foo
    param2: bar
  type: type a
- name: b
  params:
    param1: foo
    param2: bar
  type: type b
Nach dem Login kopieren

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

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"`
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonBenutzerdefinierte YAML-Tags in Go. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!