当前位置: 首页 > 面试题库 >

Golang模板并测试有效字段

印辉
2023-03-14
问题内容

在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
    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.MyFieldnil,但eq $.MyStruct.MyField.Value .也将被评估并导致您得到错误。

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

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

您也可以使用该{{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在调用时是否将返回非值。它可能看起来像这样:

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


 类似资料:
  • 当片段着色器处理完一个片段之后,模板测试(Stencil Test)会开始执行,和深度测试一样,它也可能会丢弃片段。接下来,被保留的片段会进入深度测试,它可能会丢弃更多的片段。模板测试是根据又一个缓冲来进行的,它叫做模板缓冲(Stencil Buffer),我们可以在渲染的时候更新它来获得一些很有意思的效果。 一个模板缓冲中,(通常)每个模板值(Stencil Value)是8位的。所以每个像素/

  • 问题内容: 尝试访问传递给模板的函数时出现错误: 有人可以让我知道我在做什么错吗? 模板文件(struct.tpl): 调用文件: 这是用于生成struct样板代码的程序(以防万一有人想知道为什么我要在模板中这样做)。 问题答案: 自定义函数需要在解析模板之前进行注册,否则解析器将无法分辨标识符是否为有效的函数名。模板被设计为可静态分析的,这是必需的。 您可以先使用创建一个新的未定义模板,并且除了

  • @TestTemplate方法不是常规的测试用例,而是测试用例的模板。为此,它被设计成根据已注册的提供者返回的调用上下文的数量被调用多次。因此,它必须与注册的TestTemplateInvocationContextProvider扩展一起使用。测试模板方法的每次调用都像执行常规@Test方法一样,完全支持相同的生命周期回调和扩展。有关使用示例,请参阅为测试模板提供调用上下文。

  • 问题内容: 一个布局模板和三个子模板。 layout.html tags.html content.html comment.html 代码 我很困惑如何渲染每个子模板并将结果组合到布局输出中。 谢谢。 问题答案: 与往常一样,该文档是一个很好的起点。 我在操场上写了一个工作实例 解释一下: 您不需要struct文字中的字符串:,而不是 您只能将单个对象传递给模板才能执行,这将按照指令中的要求将对

  • 问题内容: 我正在按照本教程进行学习: golang教程- Wiki, 并且我设法使除“其他任务”部分中的最后一点之外的所有内容都起作用。我对本教程的实现: html / template引擎会按预期方式打印定位标记,但会使用html实体对其进行转义。我还没有找到合适的方法。 问题答案: 使用template.HTML将正文标记为安全HTML。 以下函数将正文转换为HTML。 使用以下方式渲染页面

  • 我有一个函数,它返回一个动态绑定的-本质上,。当然,实际函数要复杂得多,足以让我为它编写测试,最好是清晰的测试。但是以下: 将始终失败,因为将解析为而不是ConT MyType。 是否有一种很好的方法将类型转换为完全限定的类型,或者检查和是否相同(在当前上下文中)?