亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 YAML 編組 golang 嵌套結構

如何使用 YAML 編組 golang 嵌套結構

Go
慕姐8265434 2022-12-26 10:46:00
我如何表示此結構的匹配標簽部分以打印出來。我嘗試以類似元數據的格式添加“NetworkPolicySpecPodSelector”結構,但我的格式不正確。package mainimport (    "fmt"    "io/ioutil"    "gopkg.in/yaml.v2")type Metadata struct {    Name      string `yaml:"name"`    Namespace string `yaml:"namespace"`}type Spec struct {    PodSelector NetworkPolicySpecPodSelector `yaml:"Spec"`}type NetworkPolicySpecPodSelector struct {    MatchLabels map[string][]string `yaml:"matchLabels"`}type Ingress struct {}type NetworkPolicy struct {    ApiVersion string   `yaml:"apiVersion`    Kind       string   `yaml:"kind"`    Metadata   Metadata `yaml:"metadata"`    Spec       struct {        PodSelector NetworkPolicySpecPodSelector    }    PolicyTypes []string `yaml:"policyTypes"`}func main() {    np := NetworkPolicy{        ApiVersion: "networking.k8s.io/v1",        Kind:       "NetworkPolicy",        Metadata: Metadata{            Name:      "allow-ingress",            Namespace: "default",        },        PolicyTypes: []string{"Ingress"},    }    yamlData, err := yaml.Marshal(&np)    if err != nil {        fmt.Printf("Error while Marshaling. %v", err)    }    fileName := "test.yaml"    err = ioutil.WriteFile(fileName, yamlData, 0644)    if err != nil {        panic("Unable to write data into the file")    }}我的輸出在這里:apiversion: networking.k8s.io/v1kind: NetworkPolicymetadata:  name: allow-ingress  namespace: defaultspec:  podselector:    matchLabels: {}policyTypes:- Ingress期望的輸出:apiversion: networking.k8s.io/v1kind: NetworkPolicymetadata:  name: allow-ingress  namespace: defaultspec:  podselector:    matchLabels:       env:prodpolicyTypes:- Ingress仍然需要成長,但我在這方面苦苦掙扎。該項目的目標是使用 YAML 輸出 Kubernetes 網絡策略。
查看完整描述

1 回答

?
拉莫斯之舞

TA貢獻1820條經驗 獲得超10個贊

首先,您需要修復結構字段標簽以反映您想要的結構。Spec在NetworkPolicy需要序列化為鍵spec及其字段PodSelector為podselector:


type NetworkPolicy struct {

    ApiVersion  string   `yaml:"apiVersion`

    Kind        string   `yaml:"kind"`

    Metadata    Metadata `yaml:"metadata"`

    Spec        Spec     `yaml:"spec"`

    PolicyTypes []string `yaml:"policyTypes"`

}


type Spec struct {

    PodSelector NetworkPolicySpecPodSelector `yaml:"podselector"`

}

然后你可以簡單地使用文字:


    np := NetworkPolicy{

        ApiVersion: "networking.k8s.io/v1",

        Kind:       "NetworkPolicy",

        Metadata: Metadata{

            Name:      "allow-ingress",

            Namespace: "default",

        },

        Spec: Spec{

            PodSelector: NetworkPolicySpecPodSelector{

                MatchLabels: map[string][]string{

                    "env": []string{"prod"},

                },

            },

        },

        PolicyTypes: []string{"Ingress"},

    }

這是操場上的完整示例:https ://go.dev/play/p/xJ-mmCVcv2M


注意:在您的代碼片段中,類型MatchLabels是map[string][]string. 我保持這樣,雖然從示例中看起來像你想要map[string]string的。


查看完整回答
反對 回復 2022-12-26
  • 1 回答
  • 0 關注
  • 108 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號