最近使用go语言html/template包进行一些静态化工作,发现template对于小于号(左尖括号<)不能正确处理,反复研究,没有弄清楚怎么回事,后来变通了一下,先对模板进行EscapeString编码,格式化以后,再进行UnescapeString编码,问题得到解决;
但还是没弄清楚template为什么对单独的小于号(左尖括号<)无法正确格式化,但发现如果左尖括号的右边有一个或多个右尖括号(>),则能正确解析格式化,而template源码包读起来很费解,最终没有弄明白,希望知道的同学能告知原因;
贴上我的解决方案,以供参考
package mytemplate
import (
"bytes"
"html"
"html/template"
"os"
"strconv"
"time"
)
type MyTemplate struct {
LeftDelim string
RightDelim string
Escape bool
}
func NewMwTemplate(left, right string, escape bool) *MwTemplate {
return &MwTemplate{
left, right, escape,
}
}
//将模板字符串格式化
//@param tplStr 模板字符串
//@param tplObj 模板数据
func (this *MyTemplate) TplToString(tplStr string, tplObj interface{}) (result string, err error) {
//如果需要编码
if this.Escape {
tplStr = html.EscapeString(tplStr)
}
t := template.New(strconv.FormatInt(time.Now().Unix(), 10))
if err != nil {
return
}
//覆盖模板左右分隔符
if this.LeftDelim != "" && this.RightDelim != "" {
t.Delims(this.LeftDelim, this.RightDelim)
}
t, err = t.Parse(tplStr)
if err != nil {
return
}
b := new(bytes.Buffer)
err = t.Execute(b, tplObj)
if err != nil {
return
}
result = string(b.String())
if this.Escape {
result = html.UnescapeString(result)
}
return
}
//TplToFile 将模板字符串格式化以后,写入文件
//@param tplStr 模板字符串
//@param tplPath 保存的文件
//@param tplObj 模板数据
func (this *MyTemplate) TplToFile(tplStr, tplPath string, tplObj interface{}) (err error) {
result, err := this.TplToString(tplStr, tplObj)
if err != nil {
return
}
fout, err := os.Create(tplPath)
if err != nil {
return
}
defer fout.Close()
_, err = fout.WriteString(result)
return
}
?
