【发布时间】:2018-07-04 04:11:41
【问题描述】:
在 Go 的 database/sql 包中,有一堆 Null[Type] 结构可以帮助将数据库值(及其可能的空值)映射到代码中。我试图弄清楚如何测试结构 field 是否为空,或者换句话说,它的 Valid 属性是否为假。
打印 SQL 字段的推荐方法是使用 .Value 属性,如下所示:
<div>{{ .MyStruct.MyField.Value }}</div>
这很好用。
但是假设我有一些稍微复杂一点的东西,我需要根据其他东西来测试这个值,例如:
<select name="y">
{{ range .SomeSlice }}
<option value="{{ . }}" {{ if eq $.MyStruct.MyField.Value .}}selected="selected"{{ end }}>{{ . }}</option>
{{ end }}
</select>
碰巧,这也很有效,除非 .MyField 不是有效的,在这种情况下我会收到错误,“错误调用 eq:用于比较的无效类型”。该错误是有道理的,因为 Go 无法将 nil 字段与另一个值(或类似的值)进行比较。
我原以为“简单”的解决方案是首先测试 Value 是否为 nil,然后将其与我需要的值进行比较,如下所示:
<select name="y">
{{ range .SomeSlice }}
<option value="{{ . }}" {{ if and ($.MyStruct.MyField) (eq $.MyStruct.MyField.Value .)}}selected="selected"{{ end }}>{{ . }}</option>
{{ end }}
</select>
在这种情况下,我得到相同的“错误调用 eq:用于比较的类型无效”。我猜这意味着 .MyField “存在”,即使 .MyField 的值无效。所以,然后我尝试了六个其他版本,大部分都出现相同的错误,例如:
<select name="y">
{{ range .SomeSlice }}
<option value="{{ . }}" {{ if and ($.MyStruct.MyField.Valid) (eq $.MyStruct.MyField.Value .)}}selected="selected"{{ end }}>{{ . }}</option>
{{ end }}
</select>
此时,我意识到我根本不明白如何测试有效字段的存在。如有任何帮助,我将不胜感激。
谢谢。
【问题讨论】:
标签: templates if-statement go go-templates