35.1 text 模板

所谓模板引擎,则将模板和数据进行渲染的输出格式化后的字符程序。对于Go,执行这个流程大概需要三步。

  • 创建模板对象
  • 加载模板
  • 执行渲染模板

其中最后一步就是把加载的字符和数据进行格式化。

package main
import (
	"log"
	"os"
	"text/template"
)
// printf "%6.2f" 表示6位宽度2位精度
const templ = ` 
{{range .}}----------------------------------------
Name:   {{.Name}}
Price:  {{.Price | printf "%6.2f"}}
{{end}}`
var report = template.Must(template.New("report").Parse(templ))
type Book struct {
	Name  string
	Price float64
}
func main() {
	Data := []Book{ {"《三国演义》", 19.82}, {"《儒林外史》", 99.09}, {"《史记》", 26.89} }
	if err := report.Execute(os.Stdout, Data); err != nil {
		log.Fatal(err)
	}
}
程序输出:
----------------------------------------
Name:   《三国演义》
Price:   19.82
----------------------------------------
Name:   《儒林外史》
Price:   99.09
----------------------------------------
Name:   《史记》
Price:   26.89

如果把模板的内容存在一个文本文件里tmp.txt:

{{range .}}----------------------------------------
Name:   {{.Name}}
Price:  {{.Price | printf "%6.2f"}}
{{end}}

我们可以这样处理:

package main
import (
	"log"
	"os"
	"text/template"
)
var report = template.Must(template.ParseFiles("tmp.txt"))
type Book struct {
	Name  string
	Price float64
}
func main() {
	Data := []Book{ {"《三国演义》", 19.82}, {"《儒林外史》", 99.09}, {"《史记》", 26.89} }
	if err := report.Execute(os.Stdout, Data); err != nil {
		log.Fatal(err)
	}
}
程序输出:
----------------------------------------
Name:   《三国演义》
Price:   19.82
----------------------------------------
Name:   《儒林外史》
Price:   99.09
----------------------------------------
Name:   《史记》
Price:   26.89

读取模板文件:

// 建立模板,自动 new("name")
// ParseFiles接受一个字符串,字符串的内容是一个模板文件的路径。
// ParseGlob是用glob的方式匹配多个文件。
Tmpl, err := template.ParseFiles("tmp.txt")  
// 假设一个目录里有a.txt b.txt c.txt的话,用ParseFiles需要写3行对应3个文件,
// 如果有更多文件,可以用ParseGlob。
// 写成template.ParseGlob("*.txt") 即可。
Tmpl, err :=template.ParseGlob("*.txt")
// 函数Must,它的作用是检测模板是否正确,例如大括号是否匹配,
// 注释是否正确的关闭,变量是否正确的书写。
var report = template.Must(template.ParseFiles("tmp.txt"))