登录
首页 >  Golang >  Go问答

检验 Go 模板中的日期

来源:stackoverflow

时间:2024-02-17 18:21:23 468浏览 收藏

学习知识要善于思考,思考,再思考!今天golang学习网小编就给大家带来《检验 Go 模板中的日期》,以下内容主要包含等知识点,如果你正在学习或准备学习Golang,就都不要错过本文啦~让我们一起来看看吧,能帮助到你就更好了!

问题内容

我试图确保我的模板文件中有一个有效的日期,如果是的话,填充一个 div,否则将其留空。数据类型为mysql.nulltime。

这是我正在尝试做的事情:

{{ if .StartDate ne nil }}
   
{{ .StartDate.Format "2006-01-02" }}
{{ else }}
{{ end }}

这似乎确实有效,我如何测试非空日期?


解决方案


如果它是强制值,您应该在渲染模板之前验证它。

但是,如果它是可选的和/或您正在编写模板驱动的应用程序,那么您至少有两个选择来实现您想要的。

仅使用零值

充分利用零值:对于 time.time 来说,它是 epoch。因此,假设您过去不能有 startdate,您可以比较您的 startdate 是否在纪元之后。

package main

import (
    "html/template"
    "os"
    "time"
)

// note the call to the `after` function of the date.
const templatetext = `
{{ if .data.startdate.after .epoch }}
   
{{ .data.startdate.format "2006-01-02" }}
{{ else }}
no date
{{ end }} ` func main() { // shortcut for the sake of brevity. tmpl := template.must(template.new("titletest").parse(templatetext)) // create an anonymous wrapper struct for your data and the additional // time value you need to compare against tcx := struct { // this of course may be of the type you actually use. data struct { startdate time.time departuretimeid int } epoch time.time }{ data: struct { startdate time.time departuretimeid int }{time.now(), 1}, epoch: time.time{}, } tmpl.execute(os.stdout, tcx) }

Run on playground

使用自定义函数

这几乎是不言自明的:只需定义一个验证您的日期的自定义函数即可。在此示例中,我再次检查了零值。但是,当然,您可以根据需要获得尽可能细化的粒度:

package main

import (
    "html/template"
    "os"
    "log"
    "time"
)

const templateText = `
{{ if afterEpoch .StartDate }}
   
{{ .StartDate.Format "2006-01-02" }}
{{ else }}
{{ end }} ` func AfterEpoch(t time.Time) bool { return t.After(time.Time{}) } type yourData struct { DepartureTimeID int StartDate time.Time } func main() { funcMap := template.FuncMap{ "afterEpoch": AfterEpoch, } tmpl := template.Must(template.New("fmap").Funcs(funcMap).Parse(templateText)) log.Println("First run") tmpl.Execute(os.Stdout, yourData{1, time.Now()}) log.Println("Second run") tmpl.Execute(os.Stdout, yourData{DepartureTimeID:1}) }

编辑

当然,您也可以使用第二种解决方案的管道符号,这是为了更具可读性,恕我直言:{{ if .startdate | afterepoch }}

Run on playground

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>