在Go模板中,有时将正确的数据传递给正确的模板的方式让我感到尴尬.使用管道参数调用模板就像只使用一个参数调用函数.

假设我有一个关于地鼠的地鼠网站.它有一个主页主模板和一个实用程序模板来打印地鼠列表.

http://play.golang.org/p/Jivy_WPh16

输出:

*The great GopherBook*    (logged in as Dewey)

    [Most popular]  
        >> Huey
        >> Dewey
        >> Louie

    [Most active]   
        >> Huey
        >> Louie

    [Most recent]   
        >> Louie

现在,我想在子模板中添加一些上下文:在列表中以不同的方式格式化名称"Dewey",因为它是当前登录用户的名称.但是我不能直接传递名称,因为有only one个可能的"点"参数管道!我能做什么?

  • 显然,我可以将子模板代码复制粘贴到主模板中(我不想这样做,因为这会丢弃拥有子模板的所有兴趣).
  • 或者,我可以使用访问器来处理某种全局变量(我也不想这样做).
  • 或者,我可以 for each 模板参数列表创建一个新的特定 struct 类型(不是很好).

推荐答案

您可以在模板中注册一个"dict"函数,该函数可用于将多个值传递给模板调用.然后,调用本身将如下所示:

{{template "userlist" dict "Users" .MostPopular "Current" .CurrentUser}}

小"dict"帮助器的代码如下,包括将其注册为模板函数:

var tmpl = template.Must(template.New("").Funcs(template.FuncMap{
    "dict": func(values ...interface{}) (map[string]interface{}, error) {
        if len(values)%2 != 0 {
            return nil, errors.New("invalid dict call")
        }
        dict := make(map[string]interface{}, len(values)/2)
        for i := 0; i < len(values); i+=2 {
            key, ok := values[i].(string)
            if !ok {
                return nil, errors.New("dict keys must be strings")
            }
            dict[key] = values[i+1]
        }
        return dict, nil
    },
}).ParseGlob("templates/*.html")

Go相关问答推荐

如何在Deliverq中高效地传达客户依赖关系?

Golang String

理解Golang中的IOTA和常量

将DATE类型的SQL字段扫描到GO struct 字段

如何在 zap 记录器库中使用自定义时间函数

我们如何保证取消的上下文会导致 goroutine 终止?

Golang Docker Selenium Chrome

Github Actions Go lambda 项目不同的 sha256sums

尽管存在 WaitGroup,Goroutines 似乎被打断了

GoLang:net.LookupHost 返回重复的 ips

如何使用 GolangCI 删除未使用的导入

将值发送到 Channel 并在就绪时读取输出

具有嵌套重复的正则表达式

为什么不同的 Wireguard 私钥会产生相同的公钥?

go-echo中如何防止+转义

如何在 GORM 中获取字段值

为什么 x/net/html Token().Attr 上的 len 在此处为空切片返回非零值?

Go:为一组单个结果实现 ManyDecode

Golang LinkedList 删除第一个元素

获取单调时间,同 CLOCK_MONOTONIC