golang template模版如何判断变量是否存在/指针是否为空

也就是语法{{if .Var}}的含义。
其含义是变量Var是否为真值,判断逻辑根据变量的类型,和golang语言本身判断变量是否为真的逻辑是一样的。

  • 数字型:值不等于零
  • 字符串:不是空串
  • 指针类型:不为空
  • 布尔类型:为True值

比较常用的是指针类型是否为空(对于其他基本类型来说,可以通过简单的比较运算来完成),语义上说就是属性是否存在,举个例子来说:

package main

import (
    "os"
    "log"
    "text/template"
)

type Address struct {
    City   string
    Street string
    Apt    int
}

func main() {
    templateText := `
{{if .Address}}
Apt is {{.Address.Apt}}.
{{else}}
Apt is NOT set.
{{end}}
`
    t := template.Must(template.New("anyname").Parse(templateText))
 
    templateVar := struct {
        Name    string
        Address * Address
    } {
        Name:   "Tom",
        Address: &Address {
            City: "Beijing",
            Street: "Changanjie",
            Apt: 0,
          },
    }
    err := t.Execute(os.Stdout, templateVar)
    if err != nil {
        log.Println("Executing template:", err)
    }

    templateVar = struct {
        Name    string
        Address * Address
    } {
        Name:   "Tom",
    }
    err = t.Execute(os.Stdout, templateVar)
    if err != nil {
        log.Println("Executing template:", err)
    }
}

运行结果就是:

Apt is 0.
Apt is NOT set.

第一个变量设置了Address,而第二个变量的Address为nil,所以就是通过变量{{.Var}}的语法来判定。