Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Teg tersuai YAML dalam Go

Teg tersuai YAML dalam Go

WBOY
WBOYke hadapan
2024-02-10 10:18:08883semak imbas

Go 中的 YAML 自定义标签

editor php Banana memperkenalkan anda kepada teg tersuai YAML dalam bahasa Go. YAML ialah format siri data yang ringan, dan bahasa Go, sebagai bahasa pengaturcaraan yang berkuasa, secara semula jadi menyediakan sokongan untuk YAML. Dalam Go, kami boleh mentakrifkan struktur data YAML melalui teg tersuai untuk menghuraikan dan memproses data YAML dengan lebih baik. Dengan menggunakan teg tersuai, kami boleh memetakan data YAML dengan mudah kepada struktur dalam Go untuk mencapai pemprosesan data yang lebih fleksibel dan mudah. Perkara berikut akan memperkenalkan secara terperinci penggunaan dan langkah berjaga-jaga bagi teg tersuai YAML dalam Go.

Kandungan soalan

Saya mempunyai struktur bersarang ini dan menambahkan teg tersuai pada sifatnya,

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

Saya mencipta beberapa kejadian palsu dan menambahkannya pada kepingan,

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)

Akhirnya saya menyusun data dan menulisnya ke fail

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

Tetapi yaml yang saya dapat tidak mempunyai nama tag huruf kecil tetapi mempunyai nama struktur huruf besar. Adakah sesiapa tahu mengapa ini berlaku dan bagaimana untuk memperbaikinya?

Penyelesaian

Salahkan pelaksanaan yaml yang anda gunakan. Sebagai contoh, jika anda menggunakan gopkg.in/yaml.v3 ,它就可以工作。在 go playground 上尝试一下。因此,一种解决方案是使用另一种 yaml 实现,例如 gopkg.in/yaml.v3.

Anda menyebut dalam ulasan yang anda gunakan https:///pkg.go.dev/sigs.k8s.io/[email protected]. Dokumentasi pakejnya berkata:

Ringkasnya, perpustakaan ini mula-mula menggunakan go-yaml untuk menukar yaml kepada json dan kemudian menggunakan json.marshaljson.unmarshal 与结构进行转换。这意味着它有效地重用了 json 结构标签以及自定义 json 方法 marshaljsonunmarshaljson , yang berbeza daripada go-yaml.

Jadi sigs.k8s.io/b3ee0cdfce799cc4f5c03349abedaab7[email protected]5db79b134e9f6b82c0b36e0489ee08ed 第一个编组到 json。如果您想要小写的字段名称,请使用 json 标签而不是 yaml Tag:

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

Dengan perubahan ini, output mengandungi nama huruf kecil (cuba di go taman permainan):

- name: a
  params:
    param1: foo
    param2: bar
  type: type a
- name: b
  params:
    param1: foo
    param2: bar
  type: type b

Sila ambil perhatian bahawa tag json 标签而不是 yaml 才能使其工作只是 sigs.k8s.io/b6f0719079302bafe55ff76bc7d76648[电子邮件受保护]5db79b134e9f6b82c0b36e0489ee08ed 包。如果您想让它与这个包和其他yaml实现一起使用,您可以提供两者 jsonyaml mesti digunakan:

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

Atas ialah kandungan terperinci Teg tersuai YAML dalam Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
Artikel sebelumnya:Data perbualan meowArtikel seterusnya:Data perbualan meow