3 minutes reading time
今天来讲讲 golang 中的标准库 template, Go标准库提供了几个 package 可以产生输出结果, 主要有2个: text/template 和 html/template, text/template 提供根据模板输出内容, html/template 产生安全的 HTML 的输出, 这两个库的使用方式很相似,文中的例子大部分是基于 html/template 展示的。
template 所使用的库没有限定扩展名, 但最经常使用的后缀是 .tmpl, 编辑器对.tmpl的支持最好, 官方的例子也是使用 .tmpl, .tpl 也经常使用。
通过 Parse 方法可以创建文件名为名字的模板。
package main
import (
"fmt"
"html/template"
"log"
)
func main()
通过 template.ParseFiles(filenames ...string) 方法可以解析一组模板, 使用各个文件名作为模板名称。
template.ParseGlob(pattern) 方法会根据pattern解析所有匹配的模板并保存。
package main
import "html/template"
func main()
除了可以解析文件, 还可以解析字符串模板。
package main
import "html/template"
const goTemplate = `
package main
import "fmt"
func main() {
fmt.Println("hello")
}
`
func main()
模板tpl可以通过tpl.Execute(io.Writer, data)去执行, 模板渲染后的内容写入到io.Writer中。Data是传给模板的动态数据。
package main
import (
"html/template"
"net/http"
)
func tmpl(w http.ResponseWriter, r *http.Request)
func main()
模板文件:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{ . }}
</body>
</html>
我们来看看解析后的文件吧: 怎么样,很神奇吧。
模板变量可以是boolean, string, character, integer, floating-point, imaginary 或者 complex constant。传给模板这样的数据就可以通过点号.来访问: {{ . }} 如果想访问复杂的变量, 可以通过 {{ .fileds }} 的方式访问。
在模板里也可以使用我们编程中常用的判断和循环逻辑。
我们可以使用 if 检查数据,如果不满足可以执行 else 逻辑。空值是是 false , 0 、nil、空字符串或者长度为0的字符串都是 false 。
<h1>Hello, { {if .Name}} { {.Name}} { {else}} Anonymous { {end}}!</h1>
如果 .Name 变量存在,会输出Hello, Name,否则输出Hello, Anonymous。 模板也提供了{ { else if .Name2 }}处理多个分支。
模板也提供了 range 关键字用来循环读取变量。
以上就是我今天讲述的 go 标准库 template 的简单使用,在以后可能还会讲一讲在模板中如何自定义函数。