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

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

在 GO 模板中使用 range over struct

在 GO 模板中使用 range over struct

Go
慕的地6264312 2023-04-24 15:51:07
我從中解析結構values.yaml并想在其中使用它template.yaml這是我的values.yaml文件:services:   app:     image: matryoshka/app     replicaCount: 1   cron:     image: matryoshka/cron     replicaCount: 1這是我的template.yaml(無效代碼):{{- range $key, $value := .Services}}     {{$key}}{{$value}} {{- end}}這給了我錯誤:panic: template: template.yaml:1:26: executing "template.yaml" at <.Services>: range can't iterate over {{atryoshka/app 1} {matryoshka/cron 1}}這是我的.go代碼:package mainimport (    "html/template"    "io/ioutil"    "os"    "path/filepath"    "gopkg.in/yaml.v2")type Values struct {    Services struct {        App struct {            Image        string `yaml:"image"`            ReplicaCount string `yaml:"replicaCount"`        } `yaml:"app"`        Cron struct {            Image        string `yaml:"image"`            ReplicaCount string `yaml:"replicaCount"`        } `yaml:"cron"`    }}func parseValues() Values {    var values Values    filename, _ := filepath.Abs("./values.yaml")    yamlFile, err := ioutil.ReadFile(filename)    err = yaml.Unmarshal(yamlFile, &values)    if err != nil {        panic(err)    }    return values}func insertValues(class Values) {    paths := []string{"template.yaml"}    t, err := template.New(paths[0]).ParseFiles(paths...)    if err != nil {        panic(err)    }    err = t.Execute(os.Stdout, class)    if err != nil {        panic(err)    }}func main() {    values := parseValues()    insertValues(values)}如何.Services正確迭代template.yaml?我發現只有選項,{{- range $key, $value := .Services}}但它不起作用。
查看完整描述

1 回答

?
函數式編程

TA貢獻1807條經驗 獲得超9個贊

正如您所經歷的那樣,您不能跨越結構的字段。您只能對切片、數組、映射和通道進行范圍。


使用地圖

最簡單的方法就是傳遞它:一張地圖。您可以直接將 YAML 解組為映射或空接口:


func parseValues() interface{} {

? ? var values interface{}

? ? // ...rest is unchanged

}


func insertValues(class interface{}) {

? ? // ...unchanged

}

稍微更改模板的格式(注意.services):


{{- range $key, $value := .services}}

{{$key}} {{$value}}

{{- end}}

有了這些,它就可以工作并且輸出是:


app map[replicaCount:1 image:matryoshka/app]

cron map[image:matryoshka/cron replicaCount:1]

使用切片

如果您想繼續使用您的Services模型,另一種選擇是手動準備和傳遞一部分字段:


insertValues([]interface{}{values.Services.App, values.Services.Cron})

然后是模板:


{{- range $key, $value := .}}

{{$key}} {{$value}}

{{- end}}

然后是輸出:


0 {matryoshka/app 1}

1 {matryoshka/cron 1}

使用切片和反射

如果您希望它保持“動態”(意味著您不必手動枚舉字段),您可以創建一個輔助函數,它使用反射來實現。



查看完整回答
反對 回復 2023-04-24
  • 1 回答
  • 0 關注
  • 175 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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