@aliasliyu4
2017-03-05T11:54:28.000000Z
字数 2670
阅读 2134
大部分的编程语言都是库实现模版,也是为了巩固mvc模式下服务端的统治地位,模版是如此的重要它甚至能够检验一个语言的成功和失败。然后,如今的现状是,单页应用大行其道,模版的使用已经变的越来越少。可能比较牢不可破的场景还是在生产邮件实体的时候。这篇文章中,我会使用一个例子去介绍如何用golang的template包生成基于定义在文件中的模版文件生成邮件实体。尽力去展现这个包中最常用的一些特性。
golang 代码:
package mainimport ("fmt""html/template""os""time")type Account struct {FirstName stringLastName string}type Purchase struct {Date time.TimeDescription stringAmountInCents int}type Statement struct {FromDate time.TimeToDate time.TimeAccount AccountPurchases []Purchase}func formatAsDate(t time.Time) string {year, month, day := t.Date()return fmt.Sprintf("%d/%d/%d", day, month, year)}func formatAsDollars(valueInCents int) (string, error) {dollars := valueInCents / 100cents := valueInCents % 100return fmt.Sprintf("$%d.%2d", dollars, cents), nil}func urgentNote(acc Account) string {return fmt.Sprintf("You have earned 100 vip points that can be used for purchases")}func hello() string {return fmt.Sprintf("hello word!")}func createMockStatement() Statement {return Statement{FromDate: time.Date(2017, 1, 1, 0, 0, 0, 0, time.UTC),ToDate: time.Date(2017, 2, 1, 0, 0, 0, 0, time.UTC),Account: Account{FirstName: "alias",LastName: "liyu4",},Purchases: []Purchase{Purchase{Date: time.Date(2017, 1, 1, 0, 0, 0, 0, time.UTC),Description: "dell ultrasharp 24 monitor",AmountInCents: 23026,},Purchase{Date: time.Date(2017, 1, 1, 0, 0, 0, 0, time.UTC),Description: "macbook air",AmountInCents: 88821,},},}}func main() {fmap := template.FuncMap{"formatAsDollars": formatAsDollars,"formatAsDate": formatAsDate,"urgentNote": urgentNote,"hello": hello,}t, err := template.New("email.tmpl").Funcs(fmap).ParseFiles("email.tmpl")if err != nil {panic(err)}//Execute applies a parsed template to the specified data object,//writing the output to wr. If an error occurs executing the template or writing its output,//execution stops, but partial results may already have been written to the output writer.//A template may be executed safely in parallel.if err := t.Execute(os.Stdout, createMockStatement()); nil != err {panic(err)}}
这段代码中最重要的部分是数据结构和main函数,其他的函数唯一的目的是展示从模版中调用不同的办法。
模版文件 email.tmpl:
{{with .Account -}}Dear {{.FirstName}} {{.LastName}},{{- end}}Below are your account statement details for period from {{.FromDate | formatAsDate}} to {{.ToDate | formatAsDate}}.{{if .Purchases -}}Your purchases:{{- range .Purchases }}{{ .Date | formatAsDate}} {{ printf "%-20s" .Description }} {{.AmountInCents | formatAsDollars -}}{{- end}}{{- else}}You didn't make any purchases during the period.{{- end}}{{$note := urgentNote .Account -}}{{if $note -}}Note: {{$note}}{{- end}}Best Wishes,Customer Service
输出:
Dear alias liyu4,Below are your account statement details for period from 1/1/2017 to 1/2/2017.Your purchases:1/1/2017 dell ultrasharp 24 monitor $230.261/1/2017 macbook air $888.21Note: You have earned 100 vip points that can be used for purchasesBest Wishes,Customer Service
原文: http://goinbigdata.com/example-of-using-templates-in-golang/