You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 22:15:07