将两个if条件合二为一

问题描述 投票:2回答:1

以下作品

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

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

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

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

在Go中,如果有条件地评估右操作数,为什么在第二个代码片段中评估最后一个条件?我该如何解决?

编辑(因为它标记为重复):不幸的是,我不能使用嵌入式{{if}},就像在另一篇文章中提到的那样。

我简化了上面的问题。我其实要做到这一点......

{{if or (and (condition A) (condition B)) (condition C)) }}
    <code goes here>
{{ end }}
go kubernetes-helm go-templates sprig
1个回答
2
投票

使用and函数时会出错,因为Go模板中的and函数没有进行短路评估(与Go中的&&运算符不同),所有参数都会被评估。在这里阅读更多相关信息:Golang template and testing for Valid fields

因此,您必须使用嵌入式{{if}}操作,因此仅在第一个参数也为真时才评估第二个参数。

您编辑了问题并说明您的实际问题是:

{{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

© www.soinside.com 2019 - 2024. All rights reserved.