本部分内容记录下使用 golang 的模板时,需要注意的一些小问题。
在我们的项目中,需要动态渲染 alertmanager 的配置文件。我们选择了 confd 作为工具来获取后台数据并渲染数据到模板中。
在模板渲染中,使用 if-else 语句的时候,当需要判断和某个字符串相等的时候,不能使用常用的 ==
,而是要使用 eq
函数,编写模板如下:
1
2
3
4
5
6
7
8
9
10
11
12
|
receivers:{{range gets "/alertmanager/receivers/*"}}{{$item := json .Value}}
{{ if eq $item.type "dingtalk" }}
- name: {{$item.name}}
dingtalk_configs:
- send_resolved: {{$item.resolved}}
webhook_url: {{$item.url}}
{{ else if eq $item.type "email" }}
- name: {{$item.name}}
email_configs:
- send_resolved: {{$item.resolved}}
to: {{$item.url}}{{end}}
{{end}}
|
另外,这种写法可读性好,但是渲染后会多出来一些空行,改为如下模板即可:
1
2
3
4
5
6
7
8
9
|
receivers:{{range gets "/alertmanager/receivers/*"}}{{$item := json .Value}}{{ if eq $item.type "dingtalk" }}
- name: {{$item.name}}
dingtalk_configs:
- send_resolved: {{$item.resolved}}
webhook_url: {{$item.url}}{{ else if eq $item.type "email" }}
- name: {{$item.name}}
email_configs:
- send_resolved: {{$item.resolved}}
to: {{$item.url}}{{end}}{{end}}
|
数据部分以 JSON 格式向模板传递。
1、golang template 对于数组循环输出,空数组(数组长度为 0)不进行渲染
2、在 range-end
结构内部,如果要使用外部的变量,比如,.Name
,需要写成 $.Name
,即在外部变量名称前加 $
即可,单独的 $
等同于 global
。