简介
fasttemplate
是一个比较简单、易用的小型模板库。fasttemplate
的作者valyala另外还开源了不少优秀的库,如大名鼎鼎的fasthttp
,前面介绍的bytebufferpool
,还有一个重量级的模板库quicktemplate
。quicktemplate
比标准库中的text/template
和html/template
要灵活和易用很多,后面会专门介绍它。今天要介绍的fasttemlate
只专注于一块很小的领域——字符串替换。它的目标是为了替代strings.Replace
、fmt.Sprintf
等方法,提供一个简单,易用,高性能的字符串替换方法。
本文首先介绍fasttemplate
的用法,然后去看看源码实现的一些细节。
快速使用
本文代码使用 Go Modules。
创建目录并初始化:
$ mkdir fasttemplate && cd fasttemplate
$ go mod init github.com/darjun/go-daily-lib/fasttemplate
安装fasttemplate
库:
$ go get -u github.com/valyala/fasttemplate
编写代码:
package main
import (
"fmt"
"github.com/valyala/fasttemplate"
)
func main() {
template := `name: {
{name}}
age: {
{age}}`
t := fasttemplate.New(template, "{
{", "}}")
s1 := t.ExecuteString(map[string]interface{}{
"name": "dj",
"age": "18",
})
s2 := t.ExecuteString(map[string]interface{}{
"name": "hjw",
"age": "20",
})
fmt.Println(s1)
fmt.Println(s2)
}
定义模板字符串,使用
{ {
和}}
表示占位符,占位符可以在创建模板的时候指定;调用
fasttemplate.New()
创建一个模板对象t
,传入开始和结束占位符;调用模板对象的
t.ExecuteString()
方法,传入参数。参数中有各个占位符对应的值。生成最终的字符串。
运行结果:
name: dj
age: 18
我们可以自定义占位符,上面分别使用{
{
和}}
作为开始和结束占位符。我们可以换成[[
和]]
,只需要简单修改一下代码即可:
template := `name: [[name]]
age: [[age]]`
t := fasttemplate.New(template, "[[", "]]")
另外,需要注意的是,传入参数的类型为map[string]interface{}
,但是fasttemplate
只接受类型为[]byte
、string
和TagFunc
类型的值。这也是为什么上面的18
要用双引号括起来的原因。
另一个需要注意的点,fasttemplate.New()
返回一个模板对象,如果模板解析失败了,就会直接panic
。如果想要自己处理错误,可以调用fasttemplate.NewTemplate()
方法,该方法返回一个模板对象和一个错误。实际上,fasttemplate.New()
内部就是调用fasttemplate.NewTemplate()
,如果返回了错误,就panic
:
// src/github.com/valyala/fasttemplate/template.go
func New(template, startTag, endTag string) *Template {
t, err := NewTemplate(template, startTag, endTag)
if err != nil {
panic(err)
}
return t
}
func NewTemplate(template, startTag, endTag string) (*Template, error) {
var t Template
err := t.Reset(template, startTag, endTag)
if err != nil {
return nil, e