将两个if条件组合为一个

时间:2019-04-01 23:03:24

标签: go kubernetes-helm go-templates sprig

下面的作品

{{- if hasKey (index $envAll.Values.policy) "type" }} 
{{- if has "two-wheeler" (index $envAll.Values.policy "type") }}
<code goes here>
{{- end }}
{{- end }}

以下内容失败并显示“运行时错误:无效的内存地址或nil指针取消引用”

{{- if and (hasKey (index $envAll.Values.policy) "type") (has "two-wheeler" (index $envAll.Values.policy "type")) }}
<code goes here>
{{- end}}

在$ envAll.Values.policy下没有声明名称为“类型”的列表。

在Go中,如果正确地计算了正确的操作数,为什么在第二个代码段中对最后一个条件进行了评估?我该如何解决?

修改(因为标记为重复): 不幸的是,我不能使用嵌入式{{if}},就像其他文章中提到的那样。

我在上面简化了我的问题。我实际上必须实现这一目标...

{{if or (and (condition A) (condition B)) (condition C)) }}
    <code goes here>
{{ end }}

1 个答案:

答案 0 :(得分:2)

使用and函数时会出错,因为Go模板中的and函数未经过短路评估(与Go中的&&运算符不同),其所有参数均为始终评估。在此处详细了解:Golang template and testing for Valid fields

因此,您必须使用嵌入的{{if}}操作,以便仅在第一个参数也为true时才对第二个参数进行求值。

您编辑了问题,并说您的实际问题是这样的:

{{if or (and (condition A) (condition B)) (condition C)) }}
    <code goes here>
{{ end }}

这是仅在模板中执行的操作:

{{ $result := false }}
{{ if (conddition A )}}
    {{ if (condition B) }}
        {{ $result = true }}
    {{ end }}
{{ end }}
{{ if or $result (condition C) }}
    <code goes here>
{{ end }}

另一种选择是将该逻辑的结果作为参数传递给模板。

如果在调用模板之前不知道结果或不知道结果,另一种选择是注册自定义函数,然后从模板中调用此自定义函数,然后可以在Go代码中进行短路评估。有关示例,请参见How to calculate something in html/template