如何在 go 模板中传入“途中创建”的地图

How to pass in a map "created on the way" in a go template

提问人:otaxhu 提问时间:9/4/2023 更新时间:9/4/2023 访问量:44

问:

我想在 Go 模板中制作 100% 可重用的 UI 组件之类的东西,但我不知道是否可以做到这一点。所以我正在尝试做下一个:

{{define "components/menu-button"}}
<a href="{{.link}}" class="text-white">{{.content}}</a>
{{end}}

这是我的组件,它期望 a,因为属性是小写的。map

然后在我的主页上,我有这个小菜单,它使用了导航栏中组件的 3 倍:components/menu-button

<div class="hidden gap-4 sm:flex">
    {{template "components/menu-button" {"link": "/contact", "content": "Contact"}}}
    {{template "components/menu-button" {"link": "/docs", "content": "Docs"}}}
    {{template "components/menu-button" {"link": "/download", "content": "Download"}}}
</div>

但我不知道我是否可以以某种方式创建一个像我在示例中所做的那样,它就像 JSON 一样,但我试过了。map

顺便说一句,它给了我下一个错误:

unexpected "{" in template clause
HTML Go GO-模板

评论


答:

2赞 mkopriva 9/4/2023 #1

Go 的模板不支持这种语法。

你可以做的是声明一个自定义函数,例如

func MakeMap(kvs ...any) map[any]any {
    m := make(map[any]any)
    for i := 0; i < len(kvs)-1; i+=2 {
        m[kvs[i]] = kvs[i+1]
    }
    return m
}

然后,您可以使用 (*Template) 使该函数可用于模板。函数,例如

t.Funcs(template.FuncMap{"M":MakeMap})

然后,在模板中,您可以使用键调用该函数。M

{{template "components/menu-button" (M "link" "/contact" "content" "Contact")}}

https://go.dev/play/p/Sl1ON-z7Mtn

评论

0赞 otaxhu 9/5/2023
哇,谢谢伙计,非常好的解决方案,我可以说的是,我更喜欢地图的键是字符串,所以它可以像JSON一样
0赞 otaxhu 9/5/2023
好吧,我会弄清楚的哈哈,谢谢你的帮助兄弟