golang echo 程式碼詳解之模版篇
在 echo 裡使用模版則必須先註冊一個,如果不註冊就會報出下面這樣的錯誤
{"time":"2017-12-12T23:03:57.939138716+08:00","level":"ERROR","prefix":"echo","file":"echo.go","line":"284","message":"Renderer not registered"}
註冊就是給 echo.Renderer 賦值。
echo 的 Renderer 屬性是一個介面
Renderer interface {
Render(io.Writer, string, interface{}, Context) error
}
一、使用標準庫模版
echo 的文件給出了使用官方模版註冊的方式
// 實現 Renderer 介面
type Template struct {
templates *template.Template
}
func (t *Template) Render(w io.Writer, name string, data interface{}, c echo.Context) error {
return t.templates.ExecuteTemplate(w, name, data)
}
// 處理 view 目錄下的檔案生成對應的模版
// 關於 ExecuteTemplate 和 ParseGlob 方法可以檢視
// https://wizardforcel.gitbooks. ... plate
t := &Template{
templates: template.Must(template.ParseGlob("public/views/*.html")),
}
// 賦值
e.Renderer = t
二、使用 pongo2
gopkg.in/flosch/pongo2.v3
是一個很不錯的模版引擎,很多時候會選擇它來渲染模版。
首先還是實現 Renderer 介面
type Template struct {
// 這裡使用一個 map 來儲存預處理了的模版
tmplMap map[string]*pongo2.Template
}
func (t *Template) Render(w io.Writer, templateName string, data interface{}, c echo.Context) error {
// 這裡根據傳來的 name 從 tmplMap 裡查詢模版來渲染
// 注意 ExcuteWriter 的引數必須是 map[string]interface{} 的
dataMap := data.(map[string]interface{})
template, exist := t.tmplMap[templateName]
if !exist {
return errors.New("template " + templateName + " not found")
}
return template.ExecuteWriter(dataMap, w)
}
然後預編譯模版
// 讀取目錄下的檔案預處理
func preCompile(dir string) *Template {
tmplMap := make(map[string]*pongo2.Template)
dirPath := filepath.Dir(dir)
fileInfos, _ := ioutil.ReadDir(dirPath)
for _, fileInfo := range fileInfos {
t, err := pongo2.FromFile(path.Join(dir, fileInfo.Name()))
if err != nil {
log.Fatalf("\"%s\": %v", fileInfo.Name(), err)
}
tmplMap[strings.Replace(fileInfo.Name(), path.Ext(fileInfo.Name()), "", -1)] = t
}
return &Template{tmplMap}
}
最後賦值
func NewTemplates(dir string) *Template {
return preCompile(dir)
}
t := NewTemplates("./views/")
e.Renderer = t
這樣自定義的 renderer 就算完成了。
原文地址:laily.net
相關文章
- Python 萬能程式碼模版:爬蟲程式碼篇Python爬蟲
- echo命令詳解
- golang select詳解Golang
- Golang WaitGroup 底層原理及原始碼詳解GolangAI原始碼
- Go For Web:Golang http 包詳解(原始碼剖析)WebGolangHTTP原始碼
- Golang Context 包詳解GolangContext
- Golang通道Channel詳解Golang
- golang-channel詳解Golang
- PHP 面試詳解之技術篇PHP面試
- Promise入門到精通(初級篇)-附程式碼詳細講解Promise
- 詳解低延時高音質:編解碼篇
- Golang 讀寫鎖RWMutex 互斥鎖Mutex 原始碼詳解GolangMutex原始碼
- windows bat系列8:echo詳解與DOS輸出空行WindowsBAT
- golang package time 用法詳解GolangPackage
- js基礎之程式碼篇1.0JS
- CSS流程分步程式碼詳解CSS
- facebookPixel程式碼安裝詳解KPI
- Golang高效實踐之泛談篇Golang
- Linux之程序掩碼umask詳解。Linux
- Spring原始碼之九finishRefresh詳解Spring原始碼
- 機器學習之決策樹詳細講解及程式碼講解機器學習
- Nuxt SSR 阿里雲部署之nginx代理–詳解篇UX阿里Nginx
- 死磕Spring之AOP篇 - Spring 事務詳解Spring
- DevOps風險測繪之程式碼篇dev
- golang程式碼生成工具Golang
- JavaScript彈幕效果程式碼詳解JavaScript
- 以太坊官方 Token 程式碼詳解
- elasticsearch的java程式碼操作詳解ElasticsearchJava
- 詳解Java 容器(第③篇)——容器原始碼分析 - ListJava原始碼
- 詳解Java 容器(第④篇)——容器原始碼分析 - MapJava原始碼
- 小程式 模版訊息
- Python基礎之七:編碼詳解Python
- 實時通訊系列目錄篇之SignalR詳解SignalR
- 【進階篇】Redis實戰之Jedis使用技巧詳解Redis
- 搭建sonarqube分析golang程式碼Golang
- golang http/transport 程式碼分析GolangHTTP
- 讓gin,echo等golang框架支援結構體註冊Golang框架結構體
- jQuery tab選項卡程式碼詳解jQuery
- Elasticsearch使用實戰以及程式碼詳解Elasticsearch