从Go模板调用方法

Bla*_*sad 41 go go-templates

让我说我有

type Person struct {
  Name string
}
func (p *Person) Label() string {
  return "This is " + p.Name
}
Run Code Online (Sandbox Code Playgroud)

如何从html /模板中使用此方法?在我的模板中我需要这样的东西:

{{ .Label() }}
Run Code Online (Sandbox Code Playgroud)

tux*_*21b 55

只是省略括号,它应该没问题.例:

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"))
}
Run Code Online (Sandbox Code Playgroud)

根据文档,如果第二个值是类型,您可以调用任何返回一个值(任何类型)或两个值的方法error.在后一种情况下,Execute如果它是非nil将返回该错误并停止执行模板.

  • 谢谢,它的确有效!我试过了,但我的方法的接收者是*人而不是人.所以它不适用于指针接收器,这似乎是一个问题. (4认同)
  • 它也适用于指针接收器.但是请注意,当你有一个`func(p*Person)Label()时,只有`*Person`类型的值才有Label()方法.你不能在`Person`上调用该方法,因为你还没有定义它. (3认同)
  • 不,你不能。但是,如果您在“*Person”上定义方法(如果您想更改其属性,则需要这样做),则始终使用“*Person”即可。 (3认同)

小智 27

您甚至可以将参数传递给函数,如下所示

type Person struct {
  Name string
}
func (p *Person) Label(param1 string) string {
  return "This is " + p.Name + " - " + param1
}
Run Code Online (Sandbox Code Playgroud)

然后在模板中写

{{with person}}
    {{ .Label "value1"}}
{{end}}
Run Code Online (Sandbox Code Playgroud)

假设模板中的人是传递给Template的Person类型的变量.