在Go的数据库/ sql程序包中,有一堆Null [Type]结构可帮助将数据库值(及其可能的null)映射到代码中。我试图弄清楚如何测试struct 字段 是否为空,或者换句话说,当其Valid属性为false时。
建议的打印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 Field与另一个值(或类似值)进行比较。
我本来以为“简单”的解决方案是先测试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>
在这一点上,我意识到我真的根本不了解如何测试有效字段的存在。我会很感激您的任何帮助。
谢谢。
andGo模板中的函数不是短路求值的(不同于&&Go中的运算符),它的所有参数总是被求值的。从text/template软件包文档中引用:
and
&&
text/template
and Returns the boolean AND of its arguments by returning the first empty argument or the last argument, that is, "and x y" behaves as "if x then y else x". All the arguments are evaluated.
这意味着{{if}}您的操作:
{{if}}
{{ if and ($.MyStruct.MyField) (eq $.MyStruct.MyField.Value .)}}
即使条件将被评估为falseif $.MyStruct.MyField是nil,但eq $.MyStruct.MyField.Value .也将被评估并导致您得到错误。
false
$.MyStruct.MyField
nil
eq $.MyStruct.MyField.Value .
相反,您可以嵌入多个{{if}}操作,如下所示:
{{if $.MyStruct.MyField}} {{if eq $.MyStruct.MyField.Value .}}selected="selected"{{end}} {{end}}
您也可以使用该{{with}}动作,但这也可以设置点,因此必须小心:
{{with}}
<select name="y"> {{range $idx, $e := .SomeSlice}} <option value="{{.}}" {{with $.MyStruct.MyField}} {{if eq .Value $e}}selected="selected"{{end}} {{end}}>{{.}}</option> {{end}} </select>
注意:
您在谈论问题中的nil值,但sql.NullXX类型是不能为的结构nil。在这种情况下,您必须检查其Valid字段以判断其Value()方法nil在调用时是否将返回非值。它可能看起来像这样:
sql.NullXX
Valid
Value()
{{if $.MyStruct.MyField.Valid}} {{if eq $.MyStruct.MyField.Value .}}selected="selected"{{end}} {{end}}