文章首发于:clawhub.club


想实现邮件发送时,选择模板功能,于是找了找资料,最开始使用go的text/template,后来发现和我想要的有点区别,最后发现直接用fmt就好了!!!
但是学了就学了,记录一下。

text/template

传入string

1
2
3
4
5
6
7
8
9
10
11
12
name := "ClawHub"
//建立一个模板,内容是"hello, {{.}}"
tmpl, err := template.New("test").Parse("hello, {{.}}")
if err != nil {
panic(err)
}
//将string与模板合成,变量name的内容会替换掉{{.}}
err = tmpl.Execute(os.Stdout, name)
//合成结果放到os.Stdout里
if err != nil {
panic(err)
}

传入struct

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
type Peolpe struct {
Name string
Age uint
}

p := Peolpe{"ClawHub", 17}
//建立一个模板
tmp2, err := template.New("test").Parse("我的名字: {{.Name}} ,年龄 {{.Age}}")
if err != nil {
panic(err)
}
//将struct与模板合成,合成结果放到os.Stdout里
err = tmp2.Execute(os.Stdout, p)
if err != nil {
panic(err)
}

文件模板-ParseFiles

1
2
3
4
//建立一个模板,这里不需要new("name")的方式,因为name自动为文件名
//将struct与模板合成,合成结果放到os.Stdout里
tmp3, err := template.ParseFiles("en.txt")
err = tmp3.Execute(os.Stdout, p)

文件模板-ParseGlob

1
2
3
4
5
6
7
8
//是用正则的方式匹配多个文件
tmp4, err := template.ParseGlob("*.txt")
//指定模板名,en
err = tmp4.ExecuteTemplate(os.Stdout, "en", p)
err = tmp4.Execute(os.Stdout, p) //模板名省略,打印的是当前模板
if err != nil {
panic(err)
}

fmt

就用普通占位符好了
%v : 相应值的默认格式


应用:
感觉一定有更好的解决方案,只不过我没接触过,所以也没有啥思路,先这样吧,模板只能传入一个值,为不能定义为任意值,如果有大神碰巧知道这,请不吝赐教。
以下是我自己想出来的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
package tmpl

import "fmt"

//模板信息
type TemplateMsg struct {
Subject, Body string
}

//注册
var signUp = map[string]string{
"subject": "欢迎注册《旅行记账》APP",
"word": "您的验证码是:%v,请于5分钟内使用。(若非本人操作,请忽略)",
}
//重置密码
var reset = map[string]string{
"subject": "《旅行记账》APP重置密码",
"word": "您的验证码是:%v,请于5分钟内使用。(若非本人操作,请忽略)",
}
//模板
var Templates = make(map[string]map[string]string)

//初始化
func init() {
Templates["signUp"] = signUp
Templates["reset"] = reset
}

//判断是否支持此模板
func CheckTemplate(templateId string) bool {
_, ok := Templates[templateId]
if ok {
return true
}
return false
}

//获取模板,目前支持出传入一位模板值
func GetTemplateV1(templateId string, word string) TemplateMsg {
temp := Templates[templateId]
body := fmt.Sprintf(temp["word"], word)
return TemplateMsg{temp["subject"], body}
}