Testing for Valid Fields in Go Templates
In Go's database/sql package, Null[Type] structs facilitate mapping database values to code with null support. However, testing for the nullity of a field (i.e., when its Valid property is false) poses some challenges.
The recommended approach to display a SQL field is through the .Value property, such as:
{{ .MyStruct.MyField.Value }}
For more complex scenarios involving value comparisons, the approach can fail if .MyField is not Valid, resulting in an "invalid type for comparison" error. Initially, testing if .MyField is nil before making the comparison seems like a straightforward solution. However, this method fails with the same error.
The and function in Go templates should be able to handle such situations. However, in earlier Go versions (< 1.18), it is not short-circuit evaluated, and all its arguments are always assessed. So, even if the condition would evaluate to false if $.MyStruct.MyField is nil, the eq $.MyStruct.MyField.Value . expression is still evaluated, triggering the error.
To resolve this issue, you can employ multiple {{if}} actions:
{{if $.MyStruct.MyField}} {{if eq $.MyStruct.MyField.Value .}}selected="selected"{{end}} {{end}}
Alternatively, you can utilize the {{with}} action, though it sets the dot and requires caution:
<select name="y"> {{range $idx, $e := .SomeSlice}} <option value="{{.}}" {{with $.MyStruct.MyField}} {{if eq .Value $e}}selected="selected"{{end}} {{end}}>{{.}}</option> {{end}} </select></p> <p>Additionally, since sql.NullXX types are struct values that cannot be nil, checking their Valid field is essential to determine if their Value() method will return a non-nil value:</p> <pre class="brush:php;toolbar:false">{{if $.MyStruct.MyField.Valid}} {{if eq $.MyStruct.MyField.Value .}}selected="selected"{{end}} {{end}}
These techniques allow you to effectively test for the existence of valid fields and compare their values in Go templates.
The above is the detailed content of How to Safely Compare Values from `sql.Null[Type]` Fields in Go Templates?. For more information, please follow other related articles on the PHP Chinese website!