假设我有
type Person struct {
Name string
}
func (p *Person) Label() string {
return "This is " + p.Name
}
如何从 html/template 使用此方法?我的模板中需要这样的东西:
{{ .Label() }}
假设我有
type Person struct {
Name string
}
func (p *Person) Label() string {
return "This is " + p.Name
}
如何从 html/template 使用此方法?我的模板中需要这样的东西:
{{ .Label() }}
只需省略括号,应该没问题。例子:
package main
import (
"html/template"
"log"
"os"
)
type Person string
func (p Person) Label() string {
return "This is " + string(p)
}
func main() {
tmpl, err := template.New("").Parse(`{{.Label}}`)
if err != nil {
log.Fatalf("Parse: %v", err)
}
tmpl.Execute(os.Stdout, Person("Bob"))
}
根据文档,您可以调用任何返回一个值(任何类型)的方法,或者如果第二个值是 type ,则返回两个值error
。在后一种情况下,Execute
如果它是非零,将返回该错误并停止执行模板。
您甚至可以将参数传递给函数,如下所示
type Person struct {
Name string
}
func (p *Person) Label(param1 string) string {
return "This is " + p.Name + " - " + param1
}
然后在模板中写
{{with person}}
{{ .Label "value1"}}
{{end}}
假设模板中的 person 是传递给 Template 的 Person 类型的变量。
不确定是我的无能还是 Go 模板最近发生了变化,但我无法访问传递给 Execute 的数据结构上的函数。总是收到“ can't evaluate field
”错误。
我能够通过使用来完成这项工作FuncMap
。
例子:
temp := template.New("templatename.gohtml")
temp.Funcs(
template.FuncMap{
"label": Label,
},
)
temp, err := temp.ParseFiles(
"templatename.gohtml",
)
if err != nil {
log.Fatal("Error parsing template", err)
}
err = temp.Execute(os.Stdout, nil)
在模板中:
{{label "the label"}}
标签功能:
func Label(param string) string {
...
}