10

在 golang模板中,当简单地输出值时,指针似乎会自动取消引用。什么时候.ID是一个指针int

{{.ID}}输出5

但是当我尝试在管道中使用它时,{{if eq .ID 5}}我得到一个错误。

executing "mytemplate" at <eq .ID 5>: error calling eq: invalid type for comparison

如何取消引用模板管道内的指针?

4

1 回答 1

10

一种方法是注册一个取消引用指针的自定义函数,这样您就可以将结果与您想要的任何内容进行比较或用它做任何其他事情。

例如:

func main() {
    t := template.Must(template.New("").Funcs(template.FuncMap{
        "Deref": func(i *int) int { return *i },
    }).Parse(src))
    i := 5
    m := map[string]interface{}{"ID": &i}
    if err := t.Execute(os.Stdout, m); err != nil {
        fmt.Println(err)
    }
}

const src = `{{if eq 5 (Deref .ID)}}It's five.{{else}}Not five: {{.ID}}{{end}}`

输出:

It's five.

或者,您可以使用不同的自定义函数,该函数将采用指针和非指针,并进行比较,例如:

    "Cmp":   func(i *int, j int) bool { return *i == j },

并从模板中调用它:

{{if Cmp .ID 5}}It's five.{{else}}Not five: {{.ID}}{{end}}

输出是一样的。在Go Playground上试试这些。

于 2016-02-24T18:53:27.317 回答