如何在Go模板中传递临时创建的map以复用UI组件
在Go模板中向组件传递临时Map的正确方式
Go模板不支持直接用JSON格式的{"key": "value"}创建临时map,这就是你报unexpected "{" in template clause错误的原因。要实现需求,有两种可靠的方式:
方法一:使用Go 1.18+内置的dict函数
Go 1.18及以上版本的模板内置了dict函数,专门用来生成临时键值对映射。调用时按照dict "键1" 值1 "键2" 值2的格式传参即可,键必须是字符串,参数要成对出现(否则会报错)。
修改你的组件调用代码如下:
<div class="hidden gap-4 sm:flex"> {{template "components/menu-button" dict "link" "/contact" "content" "Contact"}} {{template "components/menu-button" dict "link" "/docs" "content" "Docs"}} {{template "components/menu-button" dict "link" "/download" "content" "Download"}} </div>
你的组件定义不需要修改,因为dict生成的map可以通过.link、.content正常访问对应值。
方法二:自定义dict函数(兼容Go 1.17及以下版本)
如果你的Go版本低于1.18,没有内置dict函数,可以自己注册一个自定义函数来实现相同功能。
在解析模板前,先注册函数:
import ( "fmt" "html/template" ) func main() { // 定义自定义dict函数 funcMap := template.FuncMap{ "dict": func(values ...interface{}) (map[string]interface{}, error) { if len(values)%2 != 0 { return nil, fmt.Errorf("dict requires even number of arguments") } m := make(map[string]interface{}) for i := 0; i < len(values); i += 2 { key, ok := values[i].(string) if !ok { return nil, fmt.Errorf("dict keys must be strings") } m[key] = values[i+1] } return m, nil }, } // 加载模板时传入函数映射 tpl, err := template.New("").Funcs(funcMap).ParseFiles("your-template-file.html") // 后续渲染逻辑... }
注册完成后,就可以用和方法一完全相同的模板语法调用组件了。
内容的提问来源于stack exchange,提问作者otaxhu
相关产品推荐
相关产品推荐

