Teg tersuai YAML dalam Go

WBOY
Lepaskan: 2024-02-10 10:18:08
ke hadapan
853 orang telah melayarinya

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"`
}
Salin selepas log masuk

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)
Salin selepas log masuk

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 ...
Salin selepas log masuk

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/<a href="/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="2c554d41406c5a1d021f021c">[email protected]</a> 第一个编组到 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"`
}
Salin selepas log masuk

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
Salin selepas log masuk

Sila ambil perhatian bahawa tag json 标签而不是 yaml 才能使其工作只是 sigs.k8s.io/<a href="/cdn-cgi/l/email-protection" class="__cf_email__" 的一个怪癖data-cfemail="047d6569684472352a372a34">[电子邮件受保护]</a> 包。如果您想让它与这个包和其他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"`
}
Salin selepas log masuk

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

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!