Go Template嵌套模板如何同时传递现有参数与循环序号
解决方案
Go 标准库的 template 包不支持直接给嵌套模板传递多个独立参数,template 动作仅支持接收「模板名+单个根数据对象」两个入参,你之前报错就是因为尝试传入了第三个参数。要同时传递原有全套参数和循环序号,只需要把两类数据打包到同一个结构里传入即可,具体实现步骤如下:
步骤1:注册自定义dict函数到模板函数映射
模板本身不支持直接构造键值对结构,需要先自定义一个字典生成函数,注册到模板的FuncMap中:
// 模板用字典生成函数,接收偶数个参数,两两为一组作为key和value func dict(vals ...interface{}) map[string]interface{} { if len(vals)%2 != 0 { panic("dict 函数需要偶数个入参") } m := make(map[string]interface{}, len(vals)/2) for i := 0; i < len(vals); i += 2 { key, ok := vals[i].(string) if !ok { panic("dict 的key必须为字符串类型") } m[key] = vals[i+1] } return m } // 初始化模板时注册函数 tpl := template.New("").Funcs(template.FuncMap{ "dict": dict, })
步骤2:调用嵌套模板时打包参数
把你需要传入的原有全局参数、循环序号用dict打包为一个对象传入,示例写法如下:
{{range $idx, $val := .你的循环列表}} <!-- $ 代表模板的根数据(也就是你原来的全套参数),Idx存循环序号 --> {{template "你的嵌套模板名" (dict "Root" $ "Idx" $val)}} {{end}}
步骤3:调整嵌套模板内的取值逻辑
嵌套模板内从Root字段取原有参数,从Idx字段取循环序号即可:
{{define "你的嵌套模板名"}} Ape{{.Idx}} ate Apple{{.Idx}} and {{.Root.b}} {{end}}
运行后就能得到你期望的输出效果。
内容的提问来源于stack exchange,提问作者xpt
相关产品推荐
相关产品推荐

