【问题标题】:Go Template if value is set and is false如果值已设置且为 false,则转到模板
【发布时间】:2022-01-05 07:51:10
【问题描述】:
我正在使用使用 Go 模板的 Listmonk。我有一种情况,用户状态变量 (.Subscriber.Attribs.Pro) 可能存在(如果存在,它是 true 或 false。我想仅在值存在时显示一个文本块。
如果设置了Pro 属性,我的代码就可以工作。但是,如果未设置,则会将其处理为not '',从而导致值为true。
{{ if not .Subscriber.Attribs.Pro }}
You are not a Pro user!
{{ end }}
仅当Pro 属性显式设置为false 时,我如何才能运行此代码
【问题讨论】:
标签:
go
if-statement
templates
go-templates
【解决方案1】:
所以基本上你只想在提供.Subscriber.Attribs.Pro 并且是false 时显示文本。所以做一个比较:
{{ if eq false .Subscriber.Attribs.Pro }}
You are not a Pro user!
{{ end }}
我们可以像这样测试它:
t := template.Must(template.New("").Parse("{{ if eq false .Pro }}You are not a Pro user!\n{{ end }}"))
fmt.Println("Doesn't exist:")
if err := t.Execute(os.Stdout, nil); err != nil {
panic(err)
}
fmt.Println("Pro is false:")
m := map[string]interface{}{
"Pro": false,
}
if err := t.Execute(os.Stdout, m); err != nil {
panic(err)
}
fmt.Println("Pro is true:")
m["Pro"] = true
if err := t.Execute(os.Stdout, m); err != nil {
panic(err)
}
输出将是(在Go Playground 上尝试):
Doesn't exist:
Pro is false:
You are not a Pro user!
Pro is true:
如您所见,{{if}} 块的主体仅在 Pro 显式设置为 false 时才会执行。
【解决方案2】:
使用包含的Sprig hasKey 函数:
{{if hasKey .Subscriber.Attribs "Pro"}}
{{ if not .Subscriber.Attribs.Pro }}
You are not a Pro user!
{{ end }}
{{ end }}