最近使用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 }