10

golangテンプレート内で単に値を出力すると、ポインターが自動的に逆参照されるように見えます。.IDへのポインタである場合int

{{.ID}}出力5

しかし、パイプラインで使用しようとすると{{if eq .ID 5}}、エラーが発生します。

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

テンプレート パイプライン内でポインターの逆参照を行うにはどうすればよいですか?

4

1 に答える 1

10

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

于 2016-02-24T18:53:27.317 に答える