微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

gf框架之模板引擎 - 基本用法

文章来源:http://gf.johng.cn/591642

控制器视图

gf为控制器提供了良好的模板引擎支持,由gmvc.View视图对象进行管理,提供了良好的数据隔离性。控制器视图是并发安全设计的,允许在多线程中异步操作。

func (view *View) Assign(key string,value interface{})
func (view *View) Assigns(data map[string]interface{})

func (view *View) Parse(file string) ([]byte,error)
func (view *View) ParseContent(content string) ([]byte,error)

func (view *View) display(files ...string) error
func (view *View) displayContent(content string) error

func (view *View) LockFunc(f func(vars map[string]interface{}))
func (view *View) RLockFunc(f func(vars map[string]interface{}))

使用示例1:

package main

import (
    "gitee.com/johng/gf/g/net/ghttp"
    "gitee.com/johng/gf/g/frame/gmvc"
)

type ControllerTemplate struct {
    gmvc.Controller
}

func (c *ControllerTemplate) Info() {
    c.View.Assign("name","john")
    c.View.Assigns(map[string]interface{}{
        "age"   : 18,"score" : 100,})
    c.View.display("index.tpl")
}

func main() {
    s := ghttp.GetServer()
    s.BindController("/template",&ControllerTemplate{})
    s.SetPort(8199)
    s.Run()
}

其中index.tpl的模板内容如下:

<html>
    <head>
        <title>gf template engine</title>
    </head>
    <body>
        <p>Name: {{.name}}</p>
        <p>Age:  {{.age}}</p>
        <p>score:{{.score}}</p>
    </body>
</html>

执行后,访问http://127.0.0.1:8199/template/info可以看到模板被解析并展示到页面上。如果页面报错找不到模板文件,没有关系,因为这里并没有对模板目录做设置,认是当前可行文件的执行目录(Linux&Mac下是/tmp目录,Windows下是C:\Documents and Settings\用户名\Local Settings\Temp )。如何手动设置模板文件目录请查看后续章节,随后可回过头来手动修改目录后看到结果。

其中,给定的模板文件file参数是需要带完整的文件名后缀,例如:index.tplindex.html等等,模板引擎对模板文件后缀名没有要求,用户可完全自定义。此外,模板文件参数也支持文件绝对路径(完整的文件路径)。

当然,我们也可以直接解析模板内容,请看示例2:

package main

import (
    "gitee.com/johng/gf/g/net/ghttp"
    "gitee.com/johng/gf/g/frame/gmvc"
)

type ControllerTemplate struct {
    gmvc.Controller
}

func (c *ControllerTemplate) Info() {
    c.View.Assign("name",})
    c.View.displayContent(`
        <html>
            <head>
                <title>gf template engine</title>
            </head>
            <body>
                <p>Name: {{.name}}</p>
                <p>Age:  {{.age}}</p>
                <p>score:{{.score}}</p>
            </body>
        </html>
    `)
}

func main() {
    s := ghttp.GetServer()
    s.BindController("/template",&ControllerTemplate{})
    s.SetPort(8199)
    s.Run()
}

执行后,访问http://127.0.0.1:8199/template/info可以看到解析后的内容如下:

<html>
    <head>
        <title>gf template engine</title>
    </head>
    <body>
        <p>Name: john</p>
        <p>Age:  18</p>
        <p>score:100</p>
    </body>
</html>

非控制器视图

非控制器中使用模板引擎没有控制器视图的支持,可以使用底层的gview包来实现,可以通过单例管理器来获取认的单例gview对象。

gview包方法列表:

func Get(path string) *View
func New(path string) *View
func (view *View) BindFunc(name string,function interface{})
func (view *View) Parse(file string,params map[string]interface{}) ([]byte,error)
func (view *View) ParseContent(content string,error)

func (view *View) GetPath() string
func (view *View) SetPath(path string)

使用示例1:

package main

import (
    "gitee.com/johng/gf/g/net/ghttp"
    "gitee.com/johng/gf/g/frame/gins"
)

func main() {
    s := ghttp.GetServer()
    s.BindHandler("/template2",func(r *ghttp.Request){
        content,_ := gins.View().Parse("index.tpl",map[string]interface{}{
            "id"   : 123,"name" : "john",})
        r.Response.Write(content)
    })
    s.SetPort(8199)
    s.Run()
}

在这个示例中我们使用单例管理器获取一个认的视图对象,随后通过该视图渲染对应模板目录下的index.tpl模板文件并给定模板变量参数。

我们也可以通过SetPath方法中心指定视图对象的模板目录,该方法是并发安全的,但是需要注意一旦改变了该视图对象的模板目录,将会在整个进程中生效。

当然,也可以直接解析模板内容,使用示例2:

package main

import (
    "gitee.com/johng/gf/g/net/ghttp"
    "gitee.com/johng/gf/g/frame/gins"
)

func main() {
    s := ghttp.GetServer()
    s.BindHandler("/template2",func(r *ghttp.Request){
        tplcontent := `id:{{.id}},name:{{.name}}`
        content,_ := gins.View().ParseContent(tplcontent,})
        r.Response.Write(content)
    })
    s.SetPort(8199)
    s.Run()
}

执行后,访问http://127.0.0.1:8199/template2可以看到解析后的内容为:id:123,name:john

此外,需要注意的是,虽然以上示例都是在Web Server中进行展示的,但是模板引擎是对模板文件/内容的智能解析,可以用在任何的场景中。

修改模板目录

模板引擎作为gf框架的核心组件,可以通过以下方式修改模板引擎的认模板文件查找目录

  1. (推荐)单例模式获取全局View对象,通过SetPath方法手动修改
  2. 修改命令行启动参数 - viewpath
  3. 修改指定的环境变量 - gf.viewpath

例如,我们的执行程序文件为main,那么可以通过以下方式修改模板引擎的模板目录(Linux下):

  1. (推荐)通过单例模式

    gins.View().SetPath("/opt/template")
  2. 通过命令行参数

    ./main --viewpath=/opt/template/
  3. 通过环境变量

    • 启动时修改环境变量:

      gf.viewpath=/opt/config/; ./main
    • 使用genv包来修改环境变量:

      genv.Set("gf.viewpath","/opt/template")

自动检测更新

模板引擎使用了缓存机制,当模板文件第一次被读取后会被缓存到内存,下一次读取时将会直接从缓存中获取,以提高执行效率。并且,模板引擎提供了对模板文件自动检测更新机制,当模板文件在外部被修改后,模板引擎能够即时地监控到并刷新模板文件的缓存内容

模板引擎的自动检测更新机制也是gf框架的一大特色。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


1、Golang指针 在介绍Golang指针隐式间接引用前,先简单说下Go 语言的指针 (Pointer),一个指针可以指向任何一个值的内存地址 它指向那个值的内存地址,在 32 位机器上占用 4 个字节,在 64 位机器上占用 8 个字节,并且与它所指向的值的大小无关。大致上理解如下: 变量名前的
1、概述 1.1&#160;Protocol buffers定义 Protocol buffers 是语言中立、平台中立、可扩展的结构化数据序列化机制,就像 XML,但是它更小、更快、更简单。你只需定义一次数据的结构化方式,然后就可以使用特殊生成的源代码轻松地将结构化数据写入和读取各种数据流,支持各
判断文件是否存在,需要用到"os"包中的两个函数: os.Stat()和os.IsNotExit() func Stat(name string) (FileInfo, error) Stat返回描述文件f的FileInfo类型值。如果出错,错误底层类型是*PathError。 func IsNot
1、编译环境 OS :Loongnix-Server Linux release 8.3 CPU指令集 :&#160;loongarch64 平台 : 龙芯 go版本 :&#160;go version go1.15.6 linux/loong64 2、go和docker安装 docker安装: y
1、概述 Golang是一种强类型语言,虽然在代码中经常看到i:=12这种写法,这其实是编译器在编译期间自动做了类型推断。编译器会对数据进行类型检查,不同类型的数据不能赋值,不能在函数中传参。强类型语言有一些优势,很多的错误会在编译期间被检查出来,不像php和python等弱类型语言,很多错误只有运
1、概述 在《Golang常用语法糖》这篇博文中我们讲解Golang中常用的12种语法糖,在本文我们主要讲解下接收者方法语法糖。 在介绍Golang接收者方法语法糖前,先简单说下Go 语言的指针 (Pointer),大致上理解如下: 变量名前的 &amp;&#160;符号,是取变量的内存地址,不是取
1、概述 1.1 什么是gRPC RPC的全称是Remote Procedure Call,远程过程调用。RPC是一种协议,它实际是提供了一套机制,使得应用程序之间可以进行通信,而且也遵从server/client模型。使用的时候客户端调用server端提供的接口就像是调用本地的函数一样。 而gRP
1、概述 在Golang语言中,函数也是一种数据类型,可以赋值给一个变量,则该变量就是一个函数类型的变量了。通过该变量可以对函数调用。 2、Go语言函数变量详解 定义 func fun() { } var f func() f = fun 说明 我们首先定义了一个 fun 的函数,接着我们声明了一个
1、概述 Swagger是全球最大的OpenAPI规范(OAS)API开发工具框架,支持从设计和文档到测试和部署的整个API生命周期的开发。Swagger是目前最受欢迎的RESTful Api文档生成工具之一,主要的原因如下: 跨平台、跨语言的支持 强大的社区 生态圈 Swagger Tools(S
1、 概述 Protocol buffers 是语言中立、平台中立、可扩展的结构化数据序列化机制,就像 XML,但是它更小、更快、更简单。你只需定义一次数据的结构化方式,然后就可以使用特殊生成的源代码轻松地将结构化数据写入和读取各种数据流,支持各种语言。因为profobuf是二进制数据格式,需要编码