В пакете Go database/sql есть множество структур Null[Type], которые помогают отображать значения базы данных (и их возможные нулевые значения) в код. Я пытаюсь выяснить, как проверить, является ли структура field нулевой или, другими словами, когда ее свойство 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 с другим значением (или что-то в этом роде).
Я бы подумал, что «простым» решением будет сначала проверить, равно ли значение 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>
В этот момент я понимаю, что действительно не понимаю, как вообще проверить существование допустимого поля. Я был бы признателен за любую помощь, которую вы могли бы оказать.
Спасибо.