【问题标题】:Go Template if value is set and is false如果值已设置且为 false,则转到模板
【发布时间】:2022-01-05 07:51:10
【问题描述】:

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

如果设置了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 }}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-09-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-25
        • 2018-05-09
        • 1970-01-01
        相关资源
        最近更新 更多