Go模板如何传递多个值?附结构体与模板代码示例
关于Go模板多值传递的问题解答
直接说结论:你当前的写法没办法实现预期的多值传递,Go模板的{{template}}动作有特定的参数传递规则,咱们来一步步理清楚问题和解决办法。
首先,Go标准库的模板语法里,{{template}}的正确用法是{{template "模板名" 单个数据源}}——它只接受一个"管道"参数,你后面跟着的$city和$region会被直接忽略,根本传不到data模板里去。
要实现多值传递,咱们有个简单直观的办法:把需要传递的多个值打包成一个map(用模板内置的dict函数),或者自定义一个匿名结构体,这样就能把多个值作为单个参数传递给子模板了。
针对你的场景,推荐用dict函数来打包,修改后的模板代码如下:
{{range .}} {{$city := .Name}} {{range .Regions}} {{$region := .Name}} <!-- 用dict把Shops、City、Region打包成一个map传递 --> {{template "data" (dict "Shops" .Shops "City" $city "Region" $region)}} {{end}} {{end}}
对应的data子模板就可以通过键名来访问这些值了,比如:
{{define "data"}} <h3>城市:{{.City}} - 区域:{{.Region}}</h3> <ul> {{range .Shops}} <li>店铺:{{.Name}}(ID:{{.ID}})</li> {{end}} </ul> {{end}}
另外补充一点:如果你用的是Go 1.18及以上版本,也可以自定义一个tuple类型来封装多个值,但dict函数是模板内置的,不需要额外写Go代码,对模板来说更轻量易用。
总结一下:Go模板不支持直接给template动作传多个参数,必须把多值封装成单一的复合类型(map或结构体),这是模板语法的硬性规则,按照上面的方式修改就能实现你想要的多值传递效果了。
内容的提问来源于stack exchange,提问作者user9314969
相关产品推荐
相关产品推荐

