终于又到一个重头戏了。在整个服务端开发中,一个是API,一个就是网页,当前的API大部分都是通过JSON提供了,而网页就是通过HTML提供了。所以对于这么大的需求,Gin当然不会忘记,为我们提供了很多方便的操作。

html/template

在聊Gin的HTML渲染之前,先聊聊Golang(Go语言)内置的html/template,因为Gin的HTML渲染就是基于html/template实现的。

这段代码是通过Golang内置原生的html/template达到HTML渲染的目的,运行这段程序,访问http://localhost:8080/html可以看到如下信息:

Gin 实现

我们自己实现的这些,看着是比较臃肿的,在Gin中,它做了很好的封装,实现起来就很简单。

html/index.html

func main() {
    r := gin.Default()
    r.LoadHTMLFiles("html/index.html")
    r.GET("/html", func(c *gin.Context) {
        c.HTML(200, "index.html", "flysnow_org")
    })
    r.Run(":8080")
}

首先创建了一个index.html模板,放在html文件夹下,内容很简单。

然后通过r.LoadHTMLFiles("html/index.html")加载这个模板文件,这样我们才能使用它。

使用的方式非常简单,通过c.HTML(200, "index.html", "flysnow_org")即可。

这样我么运行这段代码的结果,和上面例子是一样的。

加载目录文件

r.LoadHTMLFiles方法其实已经可以加载多个模板文件了,但是如果我们模板文件太多的话,使用它就比较麻烦,对此Gin提供了LoadHTMLGlob方法,可以加载一个目录下的所有模板。

r.LoadHTMLGlob("html/*")

上面的改成这样,表示加载html目录下的所有模板文件,效果是一样的。

如果你的模板目录结构是这样的:

html/user/index.html
html/admin/index.html
html/product/index.html

也就是都有一个子目录,模板文件都在子目录里,那么我们可以采用这样的模式进行加载。

r.LoadHTMLGlob("html/**/*")

自定义函数

在HTML模板中,可能会需要一些复杂的操作,这个时候我们就可以定义一个函数来帮我们解决。Gin的自定义函数其实也是基于html/template的,这里以自己实现一个md5加密为例,演示自定义模板函数的使用。

func MD5(in string) (string, error) {
    hash := md5.Sum([]byte(in))
    return hex.EncodeToString(hash[:]), nil
}

首先自定义一个MD5函数。

    r := gin.Default()
    r.SetFuncMap(template.FuncMap{
        "md5": MD5,
    })
    r.LoadHTMLGlob("html/*")

然后通过SetFuncMap方法把我们自定义的函数Set进去,并且要在LoadHTMLGlob加载模板之前,不然不起作用。

这里的template.FuncMap其实是个map[string]interface{},key表示在模板中使用的函数名,value是对应的实现函数。

type FuncMap map[string]interface{}

好了,现在自定义实现后,我们就可以在模板中使用。

运行打开浏览器访问,可以看到如下信息:

Gin使用的是html/template模板库,自带了一些函数,但是还是不够用的,我前段时间做了一个开源的模板函数库,实现了大量的常用函数,可以直接使用。https://github.com/flysnow-org/soha

其他能力

在Gin提供的HTML渲染能力中,还有一些其他小能力,比如可自定义界定符,默认的是{ {}},我们可以改掉它。

r.Delims("{
          
   {
          
   {","}}}")

比如改成三个{ { {}}},但是这里也要注意的是,一定要模板加载之前设置。

在一个小能力就是可以自定义模板解析引擎。Gin提供的LoadHTMLFiles和LoadHTMLGlob其实就是设置模板引擎的过程,只不过Gin做了封装,让我们可以简便的使用。

func (engine *Engine) LoadHTMLGlob(pattern string) {
    left := engine.delims.Left
    right := engine.delims.Right
    templ := template.Must(template.New("").Delims(left, right).Funcs(engine.FuncMap).ParseGlob(pattern))

    engine.SetHTMLTemplate(templ)
}

func (engine *Engine) LoadHTMLFiles(files ...string) {

    templ := template.Must(template.New("").Delims(engine.delims.Left, engine.delims.Right).Funcs(engine.FuncMap).ParseFiles(files...))
    engine.SetHTMLTemplate(templ)
}

所以呢,我们可以直接自己通过template.Must生成自己的模板引擎,然后通过engine.SetHTMLTemplate就可以了。这样我们通过template.Must生成模板引擎的过程,就可以自己灵活自定义,达到自己的目的,比如刚刚讲的界定符。

小结

Golang自带的模板引擎已经足够强大和简洁了,再配合自定义函数和模块化,我认为足够用,所以我们只需要Gin就可以很方便的开发出网页应用,不需要其他更复杂的框架。

精彩文章推荐

终于又到一个重头戏了。在整个服务端开发中,一个是API,一个就是网页,当前的API大部分都是通过JSON提供了,而网页就是通过HTML提供了。所以对于这么大的需求,Gin当然不会忘记,为我们提供了很多方便的操作。 html/template 在聊Gin的HTML渲染之前,先聊聊Golang(Go语言)内置的html/template,因为Gin的HTML渲染就是基于html/template实现的。 这段代码是通过Golang内置原生的html/template达到HTML渲染的目的,运行这段程序,访问http://localhost:8080/html可以看到如下信息: Gin 实现 我们自己实现的这些,看着是比较臃肿的,在Gin中,它做了很好的封装,实现起来就很简单。 html/index.html func main() {     r := gin.Default()     r.LoadHTMLFiles("html/index.html")     r.GET("/html", func(c *gin.Context) {         c.HTML(200, "index.html", "flysnow_org")     })     r.Run(":8080") } 首先创建了一个index.html模板,放在html文件夹下,内容很简单。 然后通过r.LoadHTMLFiles("html/index.html")加载这个模板文件,这样我们才能使用它。 使用的方式非常简单,通过c.HTML(200, "index.html", "flysnow_org")即可。 这样我么运行这段代码的结果,和上面例子是一样的。 加载目录文件 r.LoadHTMLFiles方法其实已经可以加载多个模板文件了,但是如果我们模板文件太多的话,使用它就比较麻烦,对此Gin提供了LoadHTMLGlob方法,可以加载一个目录下的所有模板。 r.LoadHTMLGlob("html/*") 上面的改成这样,表示加载html目录下的所有模板文件,效果是一样的。 如果你的模板目录结构是这样的: html/user/index.html html/admin/index.html html/product/index.html 也就是都有一个子目录,模板文件都在子目录里,那么我们可以采用这样的模式进行加载。 r.LoadHTMLGlob("html/**/*") 自定义函数 在HTML模板中,可能会需要一些复杂的操作,这个时候我们就可以定义一个函数来帮我们解决。Gin的自定义函数其实也是基于html/template的,这里以自己实现一个md5加密为例,演示自定义模板函数的使用。 func MD5(in string) (string, error) {     hash := md5.Sum([]byte(in))     return hex.EncodeToString(hash[:]), nil } 首先自定义一个MD5函数。     r := gin.Default()     r.SetFuncMap(template.FuncMap{         "md5": MD5,     })     r.LoadHTMLGlob("html/*") 然后通过SetFuncMap方法把我们自定义的函数Set进去,并且要在LoadHTMLGlob加载模板之前,不然不起作用。 这里的template.FuncMap其实是个map[string]interface{},key表示在模板中使用的函数名,value是对应的实现函数。 type FuncMap map[string]interface{} 好了,现在自定义实现后,我们就可以在模板中使用。 运行打开浏览器访问,可以看到如下信息: Gin使用的是html/template模板库,自带了一些函数,但是还是不够用的,我前段时间做了一个开源的模板函数库,实现了大量的常用函数,可以直接使用。https://github.com/flysnow-org/soha 其他能力 在Gin提供的HTML渲染能力中,还有一些其他小能力,比如可自定义界定符,默认的是{ {}},我们可以改掉它。 r.Delims("{ { {","}}}") 比如改成三个{ { {}}},但是这里也要注意的是,一定要模板加载之前设置。 在一个小能力就是可以自定义模板解析引擎。Gin提供的LoadHTMLFiles和LoadHTMLGlob其实就是设置模板引擎的过程,只不过Gin做了封装,让我们可以简便的使用。 func (engine *Engine) LoadHTMLGlob(pattern string) {     left := engine.delims.Left     right := engine.delims.Right     templ := template.Must(template.New("").Delims(left, right).Funcs(engine.FuncMap).ParseGlob(pattern))     engine.SetHTMLTemplate(templ) } func (engine *Engine) LoadHTMLFiles(files ...string) {     templ := template.Must(template.New("").Delims(engine.delims.Left, engine.delims.Right).Funcs(engine.FuncMap).ParseFiles(files...))     engine.SetHTMLTemplate(templ) } 所以呢,我们可以直接自己通过template.Must生成自己的模板引擎,然后通过engine.SetHTMLTemplate就可以了。这样我们通过template.Must生成模板引擎的过程,就可以自己灵活自定义,达到自己的目的,比如刚刚讲的界定符。 小结 Golang自带的模板引擎已经足够强大和简洁了,再配合自定义函数和模块化,我认为足够用,所以我们只需要Gin就可以很方便的开发出网页应用,不需要其他更复杂的框架。 精彩文章推荐