You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Golang模板中正确渲染guregu/null.v4的null.Time类型值

解决方案

方法1:直接在模板内处理(无需额外代码)

null.Time 结构体内置两个公开字段:

  • Time:存储实际的 time.Time 类型值
  • Valid:bool类型,表示该值是否为非null

你可以直接在模板中调用time.Time的Format方法格式化日期,同时可以兼容空值场景:

{{ range .Data}}
    {{/* 非空时格式化输出,空值时显示自定义占位符 */}}
    {{if .Date.Valid}}
        {{.Date.Time.Format "2006-01-02 15:04:05"}}
    {{else}}
        无记录
    {{end}}
{{end}}

你可以根据需要调整Format的时间格式参数,注意Go语言的时间格式化必须使用固定参考时间2006-01-02 15:04:05的对应格式。

方法2:注册模板自定义函数(复用性更高)

如果多个模板都需要处理null.Time格式化,可以给模板注册自定义工具函数,减少模板重复代码:
首先在解析模板前注册函数:

func formatNullTime(nt null.Time, layout string) string {
    if nt.Valid {
        return nt.Time.Format(layout)
    }
    return "-" // 空值自定义占位符
}

// 注册函数到模板
tpl := template.New("emailTpl").Funcs(template.FuncMap{
    "formatNullTime": formatNullTime,
})
// 后续正常解析模板内容即可

之后在模板中直接调用即可:

{{ range .Data}}
    {{formatNullTime .Date "2006-01-02"}}
{{end}}

之前异常输出的原因说明

  • 直接输出{{.Date}}:打印的是null.Time结构体的完整字面量,所以包含大括号、时间值和Valid字段的布尔值
  • 调用{{.Date.EncodeText}}:该方法返回的是UTF-8编码的字节数组,所以输出的是每个字节的十进制数值
  • 调用{{.Date.Value}}:返回的是底层time.Time类型的默认字符串输出格式,默认会携带时区信息

内容的提问来源于stack exchange,提问作者Peter Nunn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 06:06:01