【发布时间】:2012-04-17 22:32:16
【问题描述】:
假设我有
type Person struct {
Name string
}
func (p *Person) Label() string {
return "This is " + p.Name
}
如何在 html/template 中使用此方法?我的模板中需要这样的东西:
{{ .Label() }}
【问题讨论】:
标签: go go-templates
假设我有
type Person struct {
Name string
}
func (p *Person) Label() string {
return "This is " + p.Name
}
如何在 html/template 中使用此方法?我的模板中需要这样的东西:
{{ .Label() }}
【问题讨论】:
标签: go go-templates
省略括号就可以了。示例:
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"))
}
根据documentation,您可以调用任何返回一个值(任何类型)的方法,或者如果第二个值是error 类型,则返回两个值。在后一种情况下,Execute 将在非零时返回该错误并停止执行模板。
【讨论】:
func (p *Person) Label() 时,只有 *Person 类型的值才会有 Label() 方法。您不能在 Person 上调用该方法,因为您尚未定义它。
*Person 上定义你的方法(如果你想改变它的属性,这是必需的),就一直使用 *Persons。
您甚至可以将参数传递给函数,如下所示
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 {
...
}
【讨论】: