Home  >  Article  >  Backend Development  >  How to pass in a "created on the way" map in a Go template

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

WBOY
WBOYforward
2024-02-05 23:39:03618browse

How to pass in a created on the way map in a Go template

Question content

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

Correct answer


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!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete