golang web框架 gin 中template模板内容实时更新原理
2018-02-22 17:28
288 查看
golang web框架 gin 中template模板内容实时更新原理
先来看看template的使用方法router := gin.Default() router.GET("/", IndexApi) //LoadHTMLFiles(templates...) router.LoadHTMLGlob("templates/**/*")
func IndexApi(c *gin.Context) { c.HTML(http.StatusOK, "index.html", gin.H{"user": "User"}) return }
当访问根目录的时候,会直接显示index.html里的内容, 当我们不关闭golang程序直接更改模板文件的内容的时候会发现再次访问根目录的时候页面内容已经更新,他自己会实时显示最新的内容,由此可知他每一次请求都会去读取本地文件,但是这样做是不是极大的降低了网页的访问速度呢?经过查看gin的源代码,发现gin代码会区分识别debug模式和release模式,当运行在debug模式下每次访问页面都会去重新加载模板,方便代码调试,当正式发布的时候只有在第一次启动的时候去读取模板。
代码如下:
func (engine *Engine) LoadHTMLFiles(files ...string) { //这里判断为debug模式运行的时候实例化HTMLDebug这个结构体 //这个结构体里的每次调用Instance方法会去重新读取模板 if IsDebugging() { engine.HTMLRender = render.HTMLDebug{Files: files, FuncMap: engine.FuncMap, Delims: engine.delims} return } templ := template.Must(template.New("").Delims(engine.delims.Left, engine.delims.Right).Funcs(engine.FuncMap).ParseFiles(files...)) engine.SetHTMLTemplate(templ) } // release直接读取缓存 func (r HTMLProduction) Instance(name string, data interface{}) Render { return HTML{ Template: r.Template, Name: name, Data: data, } } // debug每次都会读取 func (r HTMLDebug) Instance(name string, data interface{}) Render { return HTML{ Template: r.loadTemplate(), Name: name, Data: data, } } func (r HTMLDebug) loadTemplate() *template.Template { if r.FuncMap == nil { r.FuncMap = template.FuncMap{} } if len(r.Files) > 0 { return template.Must(template.New("").Delims(r.Delims.Left, r.Delims.Right).Funcs(r.FuncMap).ParseFiles(r.Files...)) } if r.Glob != "" { return template.Must(template.New("").Delims(r.Delims.Left, r.Delims.Right).Funcs(r.FuncMap).ParseGlob(r.Glob)) } panic("the HTML debug render was created without files or glob pattern") }
调用代码:
func (c *Context) HTML(code int, name string, obj interface{}) { //在这里调用HTMLRender接口的Instance方法 //在上面的代码中可以看出这个接口的实现在Debug和Release中不一样, //在debug模式下每次调用都会调用io去重新读取模板文件的内容 instance := c.engine.HTMLRender.Instance(name, obj) // 在这里面将HTML结构体里的内容进行渲染 c.Render(code, instance) }
相关文章推荐
- golang实战使用gin+xorm搭建go语言web框架restgo详解8 关于模板
- golang实战使用gin+xorm搭建go语言web框架restgo详解4 路由配置
- golang实战使用gin+xorm搭建go语言web框架restgo详解5 控制器C
- golang实战使用gin+xorm搭建go语言web框架restgo详解5.2 跳转和重定向
- golang实战使用gin+xorm搭建go语言web框架restgo详解5.3 资源控制器
- golang实战使用gin+xorm搭建go语言web框架restgo详解5.4 控制器参数绑定
- golang实战使用gin+xorm搭建go语言web框架restgo详解5.5 控制器模型绑定
- golang实战使用gin+xorm搭建go语言web框架restgo详解5.6 控制器参数校验
- Golang 页面模板之模板中如何插入数据,输出嵌套字段内容?以及神奇的减号“-”,如何去掉Go Template生成的标签换行符
- golang实战使用gin+xorm搭建go语言web框架restgo详解5.7 控制器数据响应
- golang实战使用gin+xorm搭建go语言web框架restgo详解10 使用restgo搭建后台管理系统
- [转]Go语言(Golang)的Web框架比较:gin VS echo
- golang实战使用gin+xorm搭建go语言web框架restgo详解5.9 控制器controller编程示例
- Go语言(Golang)的web框架比较之:gin vs echo
- tornado 学习笔记9 Tornado web 框架---模板(template)功能分析
- golang实战使用gin+xorm搭建go语言web框架restgo详解6.1 模型M和Orm
- java程序员10分钟可上手的golang框架golang实战使用gin+xorm搭建go语言web框架restgo
- golang实战使用gin+xorm搭建go语言web框架restgo详解6.4 推荐编程方式
- 利用golang的template模板包进行web开发
- golang实战使用gin+xorm搭建go语言web框架restgo详解7 视图层V