Go Template 的使用

本部分内容记录下使用 golang 的模板时,需要注意的一些小问题。

if-else 语句

在我们的项目中,需要动态渲染 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

updatedupdated2019-05-232019-05-23
加载评论