Разыменование указателей в тексте/шаблоне golang

внутри golang шаблон при простом выводе значений кажется, что указатели автоматически разыменовываются. Когда .ID является указателем на int,

{{.ID}} выходы 5

но когда я пытаюсь использовать его в трубопроводе, {{if eq .ID 5}} Я получаю сообщение об ошибке.

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

как сделать разыменование указателя внутри конвейера шаблонов?

1 ответов


один из способов-зарегистрировать пользовательскую функцию, которая разыменует указатель, чтобы вы могли сравнить результат с тем, что хотите, или сделать с ним что-нибудь еще.

например:

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.