登录
首页 >  Golang >  Go问答

Golang 模板和有效字段的测试

来源:Golang技术栈

时间:2023-04-27 14:44:34 333浏览 收藏

有志者,事竟成!如果你在学习Golang,那么本文《Golang 模板和有效字段的测试》,就很适合你!文章讲解的知识点主要包括golang,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

问题内容

在 Go 的 database/sql 包中,有一堆 Null[Type] 结构可以帮助将数据库值(及其可能的空值)映射到代码中。我试图弄清楚如何测试结构 字段 是否为空,或者换句话说,当它的 Valid 属性为假时。

打印 SQL 字段的推荐方法是使用 .Value 属性,如下所示:

{{ .MyStruct.MyField.Value }}

这很好用。

但是假设我有一些稍微复杂一点的东西,我需要根据其他东西来测试这个值,例如:

碰巧,这也很有效,除非 .MyField 无效,在这种情况下,我会收到错误消息“调用 eq 时出错:用于比较的类型无效”。该错误是有道理的,因为 Go 无法将 nil 字段与另一个值(或类似的值)进行比较。

我原以为“简单”的解决方案是首先测试值是否为零,然后将其与我需要的进行比较,如下所示:

在这种情况下,我得到相同的“错误调用 eq:用于比较的类型无效”。我猜这意味着 .MyField “存在”,即使 .MyField 的值无效。所以,然后我尝试了六个其他版本,大部分都出现相同的错误,例如:

在这一点上,我意识到我真的不明白如何测试一个有效字段的存在。我将不胜感激您可能获得的任何帮助。

谢谢。

正确答案

Go 模板中的and函数不是短路评估的(与&&Go 中的运算符不同),它的所有参数总是被评估。引用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 and ($.MyStruct.MyField) (eq $.MyStruct.MyField.Value .)}}

即使条件将被评估为falseif $.MyStruct.MyFieldis nil,但eq $.MyStruct.MyField.Value .也会被评估并导致您得到的错误。

相反,您可以嵌入多个{{if}}操作,如下所示:

{{if $.MyStruct.MyField}}
    {{if eq $.MyStruct.MyField.Value .}}selected="selected"{{end}}
{{end}}

您也可以使用该{{with}}操作,但这也会设置点,因此您必须小心:

笔记:

您在问题中谈论的是nil值,但sql.NullXX类型是不能是nil. 在这种情况下,您必须检查其Valid字段以判断其Value()方法在调用时是否会返回非nil值。它可能看起来像这样:

{{if $.MyStruct.MyField.Valid}}
    {{if eq $.MyStruct.MyField.Value .}}selected="selected"{{end}}
{{end}}

理论要掌握,实操不能落!以上关于《Golang 模板和有效字段的测试》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:Golang技术栈 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>