前言
文本模板是大家平时经常用的 , 例如服务端渲染,代码生成工具. 在我看来模板就是程序. 模板引擎就是编程语言, 渲染模板就是运行程序. 本文主要梳理了模板引擎作为一种特殊的编程语言提供了哪些接口(语法)使得开发人员可以灵活的编写模板以实现自己的需求一、模板语法
模板引擎作为一种简易的编程语言, 需要提供以下语法
- 运行时输入
- 变量定义/使用
- 表达式
- 循环
- 判断
- 封装
- 注释
模板与编程语言的一大区别是代码和数据和在一起的,所以要提供接口(语法)区分代码的数据的
二、示例
1. Golang标准库模板
代码如下(示例):
- 模板标签
{{ }}
- 输入
go模板接受单个输入
通过{{ . }}
获取输入
支持的所有的go类型Slice
,int64
,int
,string
,float32
,float64
如果输入是一个Struct
/Map
可以通过{{.Field}}
获取其属性
package main
import (
"fmt"
"os"
"text/template"
)
func main() {
t, _ := template.New("tpl").Parse(`{{ . }}`)
fmt.Println(t.Execute(os.Stdout, "hello world"))
t, _ = template.New("tpl").Parse(`{{ .Name }}, {{.Age}}`)
fmt.Println(t.Execute(os.Stdout, struct {
Name string
Age int64
}{"小明", 18}))
// output
// hello world<nil>
// 小明, 18<nil>
}
- 变量定义/使用
定义: {{ $var := . }}
使用 {{ {{ $var}} }}
package main
import (
"fmt"
"os"
"text/template"
)
func main() {
t, _ := template.New("tpl").Parse(`{{ $var := . }} {{ $var}}`)
fmt.Println(t.Execute(os.Stdout, "hello world"))
// output
// hello world<nil>
}
- 表达式
不支持表达式,但可以在使用函数调用, 调用是通过管道的方式实现的
函数分之内置函数,和自定义韩式
{{ function arg1 arg2 }}
管道{{ . | function1 | function2}}
package main
import (
"fmt"
"math"
"os"
"text/template"
)
func main() {
t, _ := template.New("tpl").Funcs(
template.FuncMap{
"Add": func(a, b int) int {
return a + b
},
"Pow": func(a, b int) int {
return int(math.Pow(float64(a), float64(b)))
},
}).Parse(`{{ Add 1 . | Pow 3 }}`)
fmt.Println(t.Execute(os.Stdout, 1))
// output
//9<nil>
}
- 循环
{{range $k, $v := .Var}} {{$k}} => {{$v}} {{end}}
package main
import (
"fmt"
"os"
"text/template"
)
func main() {
t, _ := template.New("tpl").Parse(`{{range $k, $v := .}} {{$k}}:{{$v}} {{end}}`)
fmt.Println(t.Execute(os.Stdout, map[string]interface{}{
"Name": "小明",
"Age": 18,
}))
// output
// Age:18 Name:小明 <nil>
}
- 判断
{{if ...}} ... {{end}}
{{if ...}} ... {{else}} ... {{end}}
{{if ...}} ... {{else if ...}} ... {{end}}
package main
import (
"fmt"
"os"
"text/template"
)
func main() {
t, _ := template.New("tpl").Parse(`{{if lt .Age 18 }} 未成年人禁止入内 {{end}}`)
fmt.Println(t.Execute(os.Stdout, map[string]interface{}{
"Name": "小明",
"Age": 16,
}))
// output
// 未成年人禁止入内 <nil>
}
-
封装
定义模板 -
注释
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。