2016-02-24 18 views
5

All'interno di un golang template quando si emettono semplicemente valori, sembra che i puntatori vengano automaticamente dereferenziati. Quando .ID è un puntatore ad un int,Puntatori di dereferenziazione in un testo/modello golang

{{.ID}} uscite 5

Ma quando cerco di usarlo in una pipeline, {{if eq .ID 5}} ottengo un errore.

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

Come faccio a fare un dereference di un puntatore all'interno di una pipeline di modello?

risposta

4

Un modo è registrare una funzione personalizzata che dereferenzia il puntatore, in modo da poter confrontare il risultato con qualsiasi cosa tu voglia o fare qualsiasi altra cosa con esso.

Ad esempio:

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}}` 

uscita:

It's five. 

In alternativa è possibile utilizzare una funzione personalizzata diverso, che avrebbe preso un puntatore e un non-pointer, e fare il confronto, ad esempio:

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

E chiamandolo dal modello:

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

L'uscita è la stessa. Prova questi su Go Playground.

Problemi correlati