Go Template 如果值已设置且为 false

Go Template if value is set and is false

我正在使用 Listmonk,它利用了 Go 模板。我有一种情况,用户状态变量 (.Subscriber.Attribs.Pro) 可能存在(如果存在,它是 truefalse。我只想显示一个文本块,如果值存在。

如果设置了 Pro 属性,我的代码就可以工作。但是,如果未设置,它将被处理为 not '',从而导致值 true.

{{ if not .Subscriber.Attribs.Pro }}
  You are not a Pro user!
{{ end }}

仅当 Pro 属性明确设置为 false

时,我如何获得此代码 运行

所以基本上您只想在提供 .Subscriber.Attribs.Profalse 时显示文本。所以做个对比:

{{ 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 时才执行。

使用包含的 Sprig hasKey 函数:

{{if hasKey .Subscriber.Attribs "Pro"}}
    {{ if not .Subscriber.Attribs.Pro }}
        You are not a Pro user!
     {{ end }}
{{ end }}