2016-02-24 5 views
5

golangの中でtemplate単に値を出力すると、ポインタが自動的に参照解除されるようです。 .IDintへのポインタ、golangのテキスト/テン​​プレートのポインタを間接参照する

{{.ID}}出力

5しかし、私は、パイプラインで{{if eq .ID 5}}を、それを使用しようとすると、私はエラーを取得するには、あるとき。

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

私はテンプレートパイプライン内のポインタの間接参照をどのように行うのですか?

答えて

4

ポインタを逆参照するカスタム関数を登録する方法もあります。その結果、望むものと何か他のものを比較することができます。例えば

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でこれらを試してください。