go语言html/template解析问题

zdrqq · · 11399 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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

 


有疑问加站长微信联系(非本文作者)

本文来自:ITEYE博客

感谢作者:zdrqq

查看原文:go语言html/template解析问题

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

11399 次点击  
加入收藏 微博
1 回复  |  直到 2018-07-05 21:52:35
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传