Go/Helm模板中define与end前后连字符(-)的作用解析
define/end前后-的作用解析 在Go/Helm模板里,我们可以用-修剪模板标签前后的空白(包括空格、水平制表符、回车、换行)。很多人会疑惑:define和end是定义模板的指令,又不是输出内容的标签,为什么还要加-?核心逻辑是:define/end本身不输出内容,但它们所在位置的前后空白属于模板的静态文本,会被输出到最终结果里,-的作用就是修剪这些多余的空白。
下面结合测试用例逐一解析:
测试用例解析
Case 0:未使用任何连字符
template.yaml
--- {{ define "test" }} Test helper function {{ end }} Test template start {{include "test" .}} Test template end
输出
--- Test template start Test helper function Test template end
解析:---后的换行、{{ define }}前后的换行、{{ end }}后的两个换行都被保留,所以---后出现三个空行;调用test模板时,模板内的前后换行也被保留,导致Test template start与Test helper function、Test helper function与Test template end之间各有一个空行。
Case 1:在define前使用连字符
template.yaml
--- {{- define "test" }} Test helper function {{ end }} Test template start {{include "test" .}} Test template end
输出
--- Test template start Test helper function Test template end
解析:{{- define }}里的-修剪了标签左侧的空白(也就是---之后的换行),所以---后的空行从3个变成2个,其他部分和Case0一致。
Case 2:在define后使用连字符
template.yaml
--- {{ define "test" -}} Test helper function {{ end }} Test template start {{include "test" .}} Test template end
输出
--- Test template start Test helper function Test template end
解析:{{ define "test" -}}里的-修剪了标签右侧的空白(也就是define标签后的换行),所以test模板内容开头没有换行,调用时Test template start直接和Test helper function连在一起,中间无空行。
Case 3:在end前使用连字符
template.yaml
--- {{ define "test" }} Test helper function {{- end }} Test template start {{include "test" .}} Test template end
输出
--- Test template start Test helper function Test template end
解析:{{- end }}里的-修剪了标签左侧的空白(也就是Test helper function之后的换行),所以test模板内容结尾没有换行,调用时Test helper function直接和Test template end连在一起,中间无空行。
Case 4:在end后使用连字符
template.yaml
--- {{ define "test" }} Test helper function {{ end -}} Test template start {{include "test" .}} Test template end
输出
--- Test template start Test helper function Test template end
解析:{{ end -}}里的-修剪了标签右侧的空白(也就是end标签后的两个换行),所以---之后直接就是Test template start,中间无空行。
内容的提问来源于stack exchange,提问作者nimdrak

