如何将当前年份添加到Go模板?

时间:2017-03-20 04:29:37

标签: go go-templates

在Go模板中,您可以检索如下字段:

template.Parse("<html><body>{{ .Title }}</body></html>")
template.Execute(w, myObject)

你如何&#34;内联&#34;当前的UTC年份?我想做这样的事情:

template.Parse("<html><body>The current year is {{time.Time.Now().UTC().Year()}}</body></html>")

但它返回错误:

  

恐慌:模板:功能&#34;时间&#34;未定义

2 个答案:

答案 0 :(得分:9)

你可以在模板中添加功能,试试这个:

package main

import (
    "html/template"
    "log"
    "os"
    "time"
)

func main() {
    funcMap := template.FuncMap{
        "now": time.Now,
    }

    templateText := "<html><body>The current year is {{now.UTC.Year}}</body></html>"
    tmpl, err := template.New("titleTest").Funcs(funcMap).Parse(templateText)
    if err != nil {
        log.Fatalf("parsing: %s", err)
    }

    // Run the template to verify the output.
    err = tmpl.Execute(os.Stdout, nil)
    if err != nil {
        log.Fatalf("execution: %s", err)
    }
}

答案 1 :(得分:1)

您已在模板中加入Title。这最终如何在模板中?您将其作为参数传递给Template.Execute()。这(不出所料)也适用于今年。

这比为此注册功能更好,更容易。这就是它的样子:

t := template.Must(template.New("").Parse(
    "<html><body>{{ .Title }}; Year: {{.Year}}</body></html>"))

myObject := struct {
    Title string
    Year  int
}{"Test Title", time.Now().UTC().Year()}

if err := t.Execute(os.Stdout, myObject); err != nil {
    fmt.Println(err)
}

输出(在Go Playground上尝试):

<html><body>Test Title; Year: 2009</body></html>

(注意:Go Playground上的当前日期/时间为2009-11-10 23:00:00,这就是您看到2009)的原因。

根据设计原则,模板不应包含复杂逻辑。如果某些东西(或看起来)在模板中过于复杂,您应该考虑在Go代码中计算结果,并将结果作为数据传递给执行,或者在模板中注册回调函数并进行模板操作调用该函数并插入返回值。

可以说当前年份不是一个复杂的逻辑。但Go是一种静态链接的语言。您只能保证可执行二进制文件仅包含Go(源)代码明确引用的包和函数。这适用于标准库的所有包(runtime包除外)。因此,模板文本不能仅仅引用和调用像time包这样的包中的函数,因为无法保证在运行时可用。