在Go的数据库/ sql程序包中,有一堆Null [Type]结构可帮助将数据库值(及其可能的null)映射到代码中。我试图弄清楚如何测试struct 字段是否为空,或者换句话说,当其Valid属性为false时。
建议的打印SQL字段的方法是使用.Value属性,如下所示:
<div>{{ .MyStruct.MyField.Value }}</div>
Run Code Online (Sandbox Code Playgroud)
这很好。
但是,假设我有一些更复杂的东西,需要在其他地方测试该值,例如:
<select name="y">
{{ range .SomeSlice }}
<option value="{{ . }}" {{ if eq $.MyStruct.MyField.Value .}}selected="selected"{{ end }}>{{ . }}</option>
{{ end }}
</select>
Run Code Online (Sandbox Code Playgroud)
碰巧的是,这也很好用,除非.MyField无效,在这种情况下,我会收到错误消息:“错误调用eq:用于比较的无效类型”。该错误是有道理的,因为Go无法将nil Field与另一个值(或类似值)进行比较。
我本以为“简单”的解决方案将是先测试Value是否为nil,然后将其与我需要的值进行比较,如下所示:
<select name="y">
{{ range .SomeSlice }}
<option value="{{ . }}" {{ if and ($.MyStruct.MyField) (eq $.MyStruct.MyField.Value .)}}selected="selected"{{ end }}>{{ . }}</option>
{{ end }}
</select>
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我得到相同的“错误调用eq:用于比较的无效类型”。我猜这意味着.MyField“存在”,即使.MyField的值无效。因此,然后我尝试了六个其他版本,大多数都具有相同的错误,例如:
<select name="y">
{{ range .SomeSlice }}
<option value="{{ . }}" {{ if and ($.MyStruct.MyField.Valid) (eq $.MyStruct.MyField.Value .)}}selected="selected"{{ …Run Code Online (Sandbox Code Playgroud) 想象一下下面的一段代码:
if someBool && funcReturningABool() {
// code here...
}
Run Code Online (Sandbox Code Playgroud)
wheresomeBool是一个布尔值并funcReturningABool返回真或假。
如果someBool等于false,funcReturningABool仍然会被执行吗?