日期:2014-05-16  浏览次数:20633 次

go语言html/template解析问题

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

?