如果nil块,如何防止非nil值触发golang模板

时间:2019-02-07 16:45:13

标签: templates go

以下错误地显示了0的值的“空”,但我只希望它精确地显示nil

package main

import (
    "os"
    "text/template"
)

type thing struct {
    Value interface{}
}

func main() {
    tmpl, _ := template.New("test").Parse("{{if .Value }} {{.Value}} {{else}} [null] {{end}}\n")
    tmpl.Execute(os.Stdout, thing{Value: "hi"}) // outputs hi
    tmpl.Execute(os.Stdout, thing{Value: nil})  // outputs [null]
    tmpl.Execute(os.Stdout, thing{Value: 0})    // outputs [null] - should output 0
    tmpl.Execute(os.Stdout, thing{Value: 2})    // outputs 2
}

游乐场链接:https://play.golang.org/p/Gg8uBCOb2vE

如何使它显示0的值?

.Value是一个interface{},在有问题的情况下,它包含一个int,但可以包含任何内容。

Show default content in a template if an object is nil otherwise show based on the set property很近,但不太一样

1 个答案:

答案 0 :(得分:1)

我只是创建一个使用template.Funcs传递给模板的函数:

https://play.golang.org/p/anxW5ooGE7N

funcs := make(map[string]interface{})
funcs["isNotNull"] = func(t interface{}) bool {
    return t != nil
}
tmpl, _ := template.New("test").Funcs(funcs).Parse("{{if isNotNull .Value }} {{.Value}} {{else}}[null] {{end}}\n")
tmpl.Execute(os.Stdout, thing{Value: "hi"}) // outputs hi
tmpl.Execute(os.Stdout, thing{Value: nil})  // outputs [null]
tmpl.Execute(os.Stdout, thing{Value: 0})    // outputs 0
tmpl.Execute(os.Stdout, thing{Value: 2})    // outputs 2