Heim  >  Artikel  >  Backend-Entwicklung  >  Benutzerdefinierte YAML-Tags in Go

Benutzerdefinierte YAML-Tags in Go

WBOY
WBOYnach vorne
2024-02-10 10:18:08849Durchsuche

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"`
}

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)

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 ...

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/b3ee0cdfce799cc4f5c03349abedaab7[email protected]5db79b134e9f6b82c0b36e0489ee08ed 第一个编组到 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"`
}

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

Bitte beachten Sie, dass das json 标签而不是 yaml 才能使其工作只是 sigs.k8s.io/b6f0719079302bafe55ff76bc7d76648[电子邮件受保护]5db79b134e9f6b82c0b36e0489ee08ed 包。如果您想让它与这个包和其他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"`
}

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen
Vorheriger Artikel:Miau-GesprächsdatenNächster Artikel:Miau-Gesprächsdaten