从Go模板调用方法
假设我有从Go模板调用方法,go,go-templates,Go,Go Templates,假设我有 type Person struct { Name string } func (p *Person) Label() string { return "This is " + p.Name } 如何从html/模板使用此方法?我的模板中需要类似的内容: {{ .Label() }} 省略括号就可以了。例如: package main import ( "html/template" "log" "os" ) type Person string
type Person struct {
Name string
}
func (p *Person) Label() string {
return "This is " + p.Name
}
如何从html/模板使用此方法?我的模板中需要类似的内容:
{{ .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"))
}
根据,可以调用返回一个值(任何类型)或两个值(如果第二个值的类型为
error
)的任何方法。在后一种情况下,Execute
将返回非nil的错误,并停止模板的执行。您甚至可以将参数传递给如下函数
type Person struct {
Name string
}
func (p *Person) Label(param1 string) string {
return "This is " + p.Name + " - " + param1
}
然后在模板中写入
{{with person}}
{{ .Label "value1"}}
{{end}}
假设模板中的person是person passed to template类型的变量。谢谢,它可以工作!我试过了,但我的方法的接受者是“人”,而不是“人”。所以它不适用于指针接收器,这似乎是一个陷阱。它也适用于指针接收器。但是请注意,当您有
func(p*Person)Label()时,只有*Person
类型的值才会有Label()方法。你不能在人
上调用该方法,因为你还没有定义它。我可以写{{&.}来获取的地址吗。在我的模板里?不,你不能。但是如果你在一个*Person
上定义你的方法(如果你想改变它的属性,这是必需的),只要一直使用*Person
就可以了。这比!如何传递多个参数?@chovy simply{{.Label“value1”“value2”}