封面.png
大家好,我叫谢伟,是一名程序员。
之前我推出了几个视频版的 golang 相关知识的讲解。看上去效果不好,毕竟简书作为写作平台,还是以阅读为主。
故以后的文章还是写出详细实例,最后再给出视频。各取所需吧。
本文的主题讲解:template 模板处理库
Package template implements data-driven templates for generating textual output.
即在MVC 设计模式的中View 层处理,html 文件中很多是静态数据,但也需要部分动态数据。template 库即是用来完成这个任务的, 即将动态数据填充入静态模板中。
机制如下:
My Name is {{ Name }}, you can call me {{ NickName }}
Name = xieWei NickName = xiexiaolu
结果:
My Name is xiewei, you can call me xiexiaolu
在Go 语言中如何使用 template ?
1. 官方实例
package mainimport ( "log" "os" "text/template")func main() { // Define a template. const letter = ` Dear {{.Name}}, {{if .Attended}} It was a pleasure to see you at the wedding. {{- else}} It is a shame you couldn't make it to the wedding. {{- end}} {{with .Gift -}} Thank you for the lovely {{.}}. {{end}} Best wishes, Josie ` // Prepare some data to insert into the template. type Recipient struct { Name, Gift string Attended bool } var recipients = []Recipient{ {"Aunt Mildred", "bone china tea set", true}, {"Uncle John", "moleskin pants", false}, {"Cousin Rodney", "", false}, } // Create a new template and parse the letter into it. t := template.Must(template.New("letter").Parse(letter)) // Execute the template for each recipient. for _, r := range recipients { err := t.Execute(os.Stdout, r) if err != nil { log.Println("executing template:", err) } } }
结果:
Dear Aunt Mildred, It was a pleasure to see you at the wedding. Thank you for the lovely bone china tea set. Best wishes, Josie Dear Uncle John, It is a shame you couldn't make it to the wedding. Thank you for the lovely moleskin pants. Best wishes, Josie Dear Cousin Rodney, It is a shame you couldn't make it to the wedding. Best wishes, Josie Program exited.
2. 基本使用方法
1. 新建或者加载一个模板对象
type Template func New(name string) *Template func ParseFiles(filenames ...string) (*Template, error) func Must(t *Template, err error) *Template
即:比如: t := template.New("test template")
2. 加载模板, 定义动态数据占位符
func (t *Template) Parse(text string) (*Template, error) func (t *Template) ParseFiles(filenames ...string) (*Template, error)
即:比如
var templateText = `This is a test for template: Name: {{.Name}} Age: {{.Age}} School: {{.School}} Married: {{.MarriedOK}} ` t, err = t.Parse(templateText)
3. 定义动态数据,执行
var example = struct { Name string Age int School string MarriedOK bool}{ Name: "xiewei", Age: 18, School: "shanghaiUniversity", MarriedOK: true, } t.Execute(os.Stdout, example)
结果:
This is a test for template Name: xiewei Age: 18 School: shanghaiUniversity Married: true
3. 说明
1. 字段
{{.}}
表示当前字段{{.Name}}
表示某个结构体的 Name 字段结构体字段需能被外部访问:即 字段首字母大写
2. 循环操作
{{range .Field}} {{.ChildFieldOne}} -- {{.ChildFieldTwo }} {{ end }}
3. 判断
{{if .Field}} if部分的输出 {{else}} else 部分的输出 {{end}}
4. pipelines
即:处理经由前面一个指令传出的正确输出信息,对错误信息信息没有直接处理能力
管道符: |
{{.Field | html }}
5. 模板函数
即:可以对某个字段使用函数操作。适用于稍微复杂的字段处理。
type FuncMap map[string]interface{} t = t.Funcs(template.FuncMap{"handleFieldName": HandleFunc})
内置模板函数:
var builtins = FuncMap{ "and": and, "call": call, "html": HTMLEscaper, "index": index, "js": JSEscaper, "len": length, "not": not, "or": or, "print": fmt.Sprint, "printf": fmt.Sprintf, "println": fmt.Sprintln, "urlquery": URLQueryEscaper, }
4. 示例
package mainimport ( "fmt" "html/template" "os")var Text = ` This is a test Template: Name: {{.Name}} Age:{{.Age}} Married: {{.Married}} School: {{.School}} ` var TextTwo = ` This is a test Template: Name: {{.Name |handleString | printf }} Age: {{.Age | handleInt}} Married: {{.Married }} School: {{.School | handleString}} ` var TextThree = ` {{if .Fields }}{{range .Fields }} Name: {{.Name}} - Age:{{.Age}} - School:{{.School}} - Married:{{.Married}} {{ end }}{{end}} {{if .Names}}{{ range .Names }} {{.}} {{ end }}{{end}} ` type Information struct { Name string Age int Married bool School string} func (this Information) String() string { return fmt.Sprintf(` This is a test String interface. Name: %s Age: %d Married: %t School: %s `, this.Name, this.Age, this.Married, this.School) } func (this Information) Template(text string) { var ( t *template.Template ) t = template.New("New template for information") var ( err error ) if t, err = t.Parse(text); err != nil { fmt.Println("Template parse err" + err.Error()) return } t.Execute(os.Stdout, this) } func (this Information) TemplateWithFuncMap(text string) { var ( t *template.Template err error ) t = template.New("123").Funcs(InfoFuncMap()) //t = template.New("template with funcmap") //t = t.Funcs(template.FuncMap{"handleString": handleString, // "handleInt": handleInt}) if t, err = t.Parse(text); err != nil { fmt.Println("err" + err.Error()) return } t.Execute(os.Stdout, this) } func InfoFuncMap() template.FuncMap { return template.FuncMap{ "handleString": handleString, "handleInt": handleInt, } } func handleString(field string) string { if field == "" { return "None" } else { return " xiewei-test-for: " + field } } func handleInt(number int) int { return number + 20} type NewInformation struct { Fields []Information Names []string} func RangeTemplate(args NewInformation, text string) { var ( t *template.Template err error ) t = template.New("new template") if t, err = t.Parse(text); err != nil { fmt.Println("err" + err.Error()) return } t.Execute(os.Stdout, args) } func main() { var ( newInfor Information ) newInfor = Information{ Name: "xiewei", Age: 18, School: "shanghaiUniversity", Married: true, } fmt.Println("1") fmt.Println(newInfor) fmt.Println("2") newInfor.Template(Text) fmt.Println("3") newInfor.TemplateWithFuncMap(TextTwo) fmt.Println("4") var ( newInformations NewInformation ) newInformations = NewInformation{ Fields: []Information{ Information{Name: "xiexiaolu", Age: 19, Married: false, School: "pekingUniversity"}, Information{Name: "xiexie", Age: 20, Married: true, School: "XXXXX"}, }, Names: []string{ "jiewu", "baidu", "google", "aiqiyi", "wangyi", }, } RangeTemplate(newInformations, TextThree) }
结果:
1 This is a test String interface. Name: xiewei Age: 18 Married: trueSchool: shanghaiUniversity 2 This is a test Template: Name: xiewei Age:18 Married: trueSchool: shanghaiUniversity 3 This is a test Template: Name: xiewei-test-for: xiewei Age: 38 Married: trueSchool: xiewei-test-for: shanghaiUniversity 4 Name: xiexiaolu - Age:19 - School:pekingUniversity - Married:false Name: xiexie - Age:20 - School:XXXXX - Married:true jiewu baidu google aiqiyi wangyi
5. 视频
唉 , 我好像英文发音不准叻。我会注意的。
6. 开源库处理方式
beego --> bee
func Tmpl(text string, data interface{}) { output := colors.NewColorWriter(os.Stderr) t := template.New("Usage").Funcs(BeeFuncMap()) template.Must(t.Parse(text)) err := t.Execute(output, data) if err != nil { beeLogger.Log.Error(err.Error()) } } func BeeFuncMap() template.FuncMap { return template.FuncMap{ "trim": strings.TrimSpace, "bold": colors.Bold, "headline": colors.MagentaBold, "foldername": colors.RedBold, "endline": EndLine, "tmpltostr": TmplToString, } } var usageTemplate = `Bee is a Fast and Flexible tool for managing your Beego Web Application. {{"USAGE" | headline}} {{"bee command [arguments]" | bold}} {{"AVAILABLE COMMANDS" | headline}} {{range .}}{{if .Runnable}} {{.Name | printf "%-11s" | bold}} {{.Short}}{{end}}{{end}} Use {{"bee help [command]" | bold}} for more information about a command. {{"ADDITIONAL HELP TOPICS" | headline}} {{range .}}{{if not .Runnable}} {{.Name | printf "%-11s"}} {{.Short}}{{end}}{{end}} Use {{"bee help [topic]" | bold}} for more information about that topic. `
var AppHelpTemplate = `NAME: {{.Name}}{{if .Usage}} - {{.Usage}}{{end}} USAGE: {{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}} {{if .VisibleFlags}}[global options]{{end}}{{if .Commands}} command [command options]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}{{if .Version}}{{if not .HideVersion}} VERSION: {{.Version}}{{end}}{{end}}{{if .Description}} DESCRIPTION: {{.Description}}{{end}}{{if len .Authors}} AUTHOR{{with $length := len .Authors}}{{if ne 1 $length}}S{{end}}{{end}}: {{range $index, $author := .Authors}}{{if $index}} {{end}}{{$author}}{{end}}{{end}}{{if .VisibleCommands}} COMMANDS:{{range .VisibleCategories}}{{if .Name}} {{.Name}}:{{end}}{{range .VisibleCommands}} {{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}}{{end}}{{end}}{{if .VisibleFlags}}GLOBAL OPTIONS: {{range $index, $option := .VisibleFlags}}{{if $index}} {{end}}{{$option}}{{end}}{{end}}{{if .Copyright}} COPYRIGHT: {{.Copyright}}{{end}} `
网盘:链接 密码:475u
作者:谢小路
链接:https://www.jianshu.com/p/8b580a3b6a76