2016-02-24 19 views
5

Wewnątrz golang template po prostu wyprowadzając wartości, wydaje się, że wskaźniki są automatycznie dereferencyjne. Kiedy .ID jest wskaźnikiem do int,Wskaźniki odwołań w tekście/szablonie golang

{{.ID}} wyjścia 5

Ale gdy próbuję go użyć w rurociągu, {{if eq .ID 5}} pojawia się błąd.

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

Jak mogę zrobić dereference o wskaźnik wewnątrz szablonu rurociągu?

Odpowiedz

4

Jednym ze sposobów jest zarejestrowanie niestandardowej funkcji, która usuwa zaznaczenie wskaźnika, aby można było porównać wynik z dowolną potrzebą lub zrobić z nim coś innego.

Na przykład:

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

wyjściowa:

It's five. 

Alternatywnie można użyć innej niestandardowej funkcji, które zajęłoby się wskaźnik i non-pointer, i robić porównania, np:

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

I wywoływanie go z szablonu:

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

Dane wyjściowe są takie same. Wypróbuj te na Go Playground.