验证 Go 模板中的日期

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


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


{{ if .StartDate ne nil }}

   <div class="box date-row" id="startdate-{{ .DepartureTimeID }}">{{ .StartDate.Format "2006-01-02" }}</div>

{{ else }}

   <div class="box date-row" id="startdate-{{ .DepartureTimeID }}"></div>

{{ end }}

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


米脂
浏览 154回答 1
1回答

元芳怎么了

如果它是强制值,您应该在渲染模板之前对其进行验证。但是,如果它是可选的和/或您正在编写模板驱动的应用程序,那么您至少有两个选项来实现您想要的。仅使用零值充分利用零值:因为time.Time这就是epoch。因此,假设您不能拥有StartDate过去的日期,您可以比较您的 StartDate 是否在纪元之后。package mainimport (    "html/template"    "os"    "time")// Note the call to the `After` function of the date.const templateText = `{{ if .Data.StartDate.After .Epoch }}   <div class="box date-row" id="startdate-{{ .Data.DepartureTimeID }}">{{ .Data.StartDate.Format "2006-01-02" }}</div>{{ else }}   <div class="box date-row" id="startdate-{{ .Data.DepartureTimeID }}">No date</div>{{ 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)}package mainimport (    "html/template"    "os"    "log"    "time")const templateText = `{{ if afterEpoch .StartDate }}   <div class="box date-row" id="startdate-{{ .DepartureTimeID }}">{{ .StartDate.Format "2006-01-02" }}</div>{{ else }}   <div class="box date-row" id="startdate-{{ .DepartureTimeID }}"></div>{{ 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})}编辑:当然,您也可以对第二种解决方案使用管道表示法,即 by ,以提高可读性,恕我直言:{{ if .StartDate | afterEpoch }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go