這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
最近使用go語言html/template包進行一些靜態化工作,發現template對於小於符號(左角括弧<)不能正確處理,反覆研究,沒有弄清楚怎麼回事,後來變通了一下,先對模板進行EscapeString編碼,格式化以後,再進行UnescapeString編碼,問題得到解決;
但還是沒弄清楚template為什麼對單獨的小於符號(左角括弧<)無法正確格式化,但發現如果左角括弧的右邊有一個或多個右角括弧(>),則能正確解析格式化,而template源碼包讀起來很費解,最終沒有弄明白,希望知道的同學能告知原因;
貼上我的解決方案,以供參考
package mytemplateimport ("bytes""html""html/template""os""strconv""time")type MyTemplate struct {LeftDelim stringRightDelim stringEscape 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}