【问题标题】:Call a method from a Go template从 Go 模板调用方法
【发布时间】: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


    【解决方案1】:

    省略括号就可以了。示例:

    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 将在非零时返回该错误并停止执行模板。

    【讨论】:

    • 谢谢,它有效!我试过了,但是我的方法的接收者是 *Person 而不是 Person。所以它不适用于指针接收器,这似乎是个问题。
    • 它也适用于指针接收器。但请注意,当您有 func (p *Person) Label() 时,只有 *Person 类型的值才会有 Label() 方法。您不能在 Person 上调用该方法,因为您尚未定义它。
    • 我可以写 {{ &. }} 来获取 .在我的模板中?
    • 不,你不能。但是如果你在 *Person 上定义你的方法(如果你想改变它的属性,这是必需的),就一直使用 *Persons。
    • 这比template.Funcs(FuncMap)干净多了!
    【解决方案2】:

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

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

    【讨论】:

    • 如何传递多个参数?
    • @chovy 只需 {{ .Label "value1" "value2"}}
    【解决方案3】:

    不确定是我的无能还是 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 {
      ...
    }
    

    【讨论】:

      猜你喜欢
      • 2014-03-31
      • 2021-12-07
      • 2013-03-07
      • 2011-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-22
      • 1970-01-01
      相关资源
      最近更新 更多