Home > Article > Backend Development > How to pass in a "created on the way" map in a Go template
I want to make something like UI components 100% reusable in Go templates, but I don't know if it can be done. So I'm trying to do the next step:
<code>{{define "components/menu-button"}} <a href="{{.link}}" class="text-white">{{.content}}</a> {{end}} </code>
This is my component, it requires a map
because the properties are lowercase.
Then in my homepage I have a small menu that uses the components/menu-button
component 3 times in my navbar:
<code><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> </code>
But I don't know if I can somehow create a map
like I did in the example and it would be like JSON, but I tried.
BTW, it gave me the next error:
unexpected "{" in template clause
Go's templates do not support this syntax.
What you can do is declare a custom function like
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 }
You can then make the function available to templates (*templates).Funcs using
, e.g.
t.Funcs(template.FuncMap{"M":MakeMap})
Then, within the template, you can call the function using the key M
.
{{template "components/menu-button" (M "link" "/contact" "content" "Contact")}}
https://www.php.cn/link/0740bb92e583cd2b88ec7c59f985cb41
The above is the detailed content of How to pass in a "created on the way" map in a Go template. For more information, please follow other related articles on the PHP Chinese website!