Pointers 取消引用golang文本/模板中的指针

Pointers 取消引用golang文本/模板中的指针,pointers,go,go-templates,Pointers,Go,Go Templates,在golang内部,当简单地输出值时,指针似乎会自动取消引用。当.ID是指向int的指针时 {{.ID}输出5 但是当我尝试在管道中使用它时,{{if eq.ID 5}}我得到一个错误 在以下位置执行“mytemplate”:调用eq时出错:用于比较的类型无效 如何在模板管道中取消对指针的引用?一种方法是注册一个自定义函数来取消对指针的引用,这样您就可以将结果与您想要的结果进行比较,或者使用它执行任何其他操作 例如: func main() { t := template.Must(te

在golang内部,当简单地输出值时,指针似乎会自动取消引用。当
.ID
是指向
int
的指针时

{{.ID}
输出
5

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

在以下位置执行“mytemplate”:调用eq时出错:用于比较的类型无效


如何在模板管道中取消对指针的引用?

一种方法是注册一个自定义函数来取消对指针的引用,这样您就可以将结果与您想要的结果进行比较,或者使用它执行任何其他操作

例如:

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}}
输出是相同的。试穿这些衣服