golang tempalte使用
更新于 阅读 13 次
经常在脚本编写中需要使用到模版tempalte,用来静态生成文件、代码,总结如下。
template中define使用
在使用编写template时可以使用{{define}}{{end}}来命名模版,在模版引入时直接使用命名即可,如下: header.tpl
{{define header}} header demo {{end}}
article.tpl
{{define article}} {{template header .}} {{end}}
然后在golang中使用**template.ParseFiles(filenames ...string)**解析所有的模版:
t, err := template.ParseFiles("/article.tpl", "header.tpl") if err != nil { panic(err) } var buf bytes.Buffer // 这里的article指定解析的入口模版,当在解析和输出时如果发生错误,将停止,但这是可能buf已经被写入了部分数据,需要注意。 err = t.ExecuteTemplate(&buf, "article", data) if err != nil { panic(err) } return buf.String()
条件判断
- if else
struct Person { Age int Sex string } tom := Person{ Age: 20, Sex: "男", } // xxx t.Execute(&buf, tom)
{{if gt .Age 20}} rather than 20 {{else if eq .Age 20}} equal 20 {{else}} less than 20 {{end}}
上面的代码中表示大于、等于,在条件判断中需要使用end作为结尾的标识符。
- 内置函数 eq 等于
{{if eq val1 val2}}{{end}} ne 不等于 {{if ne val1 val2}}{{end}} gt 大于 {{if gt val1 val2}}{{end}}
lt 大于 {{if lt val1 val2}}{{end}}
ge 大于等于
{{if ge val1 val2}}{{end}}
le 大于等于 {{if le val1 val2}}{{end}}
and 与
{{if and .cond1 .cond2}}{{end}}
or 或
{{if or .cond1 .cond2}}{{end}}
not 非
{{if not .cond1 }}{{end}}
年龄大于20的男性
```tpl
{{if and (gt .Age 20) (eq .Sex "男")}}
{{end}
年龄小于20,或者不是男性
{{if or (lt .Age 20) (ne .Sex "男")}} {{end}
template.FuncMap
模版中提供的内置函数无法满足业务场景,要添加自定义函数,提供了template.FuncMapy用来注册自定义方法
func lowerCase(str string) string { return xxx; } func1 := template.FuncMap{"lowerCase": lowerCase} t.Funcs(func1)
上面注册了一个将名称转为小写的方法lowerCase,在模版中使用如下
{{lowerCase .Name}}
有多个参数的话直接在后面追家即可
模版读取
经常会将模版写在单独的文件中,就需要读取文件,可以使用path/filepath来获取绝对路径
file, err := filepath.Abs(tplPath) if err != nil { panic(err) }