50

假设我有

type Person struct {
  Name string
}
func (p *Person) Label() string {
  return "This is " + p.Name
}

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

{{ .Label() }}
4

3 回答 3

65

只需省略括号,应该没问题。例子:

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如果它是非零,将返回该错误并停止执行模板。

于 2012-04-17T22:43:24.140 回答
37

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

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 类型的变量。

于 2013-08-06T01:00:21.547 回答
-1

不确定是我的无能还是 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 {
  ...
}
于 2021-11-23T17:01:49.717 回答