Go web入门Go pongo2模板引擎


Posted in Golang onMay 20, 2022

Go pongo2 教程展示了如何使用 pongo2 模板引擎在 Golang 中使用模板。

模板引擎是一个库,旨在将模板与数据结合起来以生成文档。模板引擎用于生成大量电子邮件、源代码预处理或生成动态 HTML 页面。

模板由静态数据和动态区域组成。动态区域稍后被数据替换。渲染函数稍后将模板与数据结合起来。模板引擎用于将模板与数据模型相结合以生成文档。

pongo2 库是一个受 Django 模板引擎启发的 Go 模板引擎。

下载 pongo2 函数库

使用如下命令:

go get -u github.com/flosch/pongo2/v4

安装成功后可以看到如下输出:

go: downloading github.com/flosch/pongo2 v0.0.0-20200913210552-0d938eb266f3
go: downloading github.com/flosch/pongo2/v4 v4.0.2
go: downloading gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b
go: downloading github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e
go: downloading github.com/kr/text v0.1.0
go: added github.com/flosch/pongo2/v4 v4.0.2

pongo2 在模板字符串中使用了各种分隔符:

{% %} - statements

{{ }} - expressions to print to the template output

{# #} - comments which are not included in the template output

# ## - line statements

模板可以从带有 pongo2.FromString 的字符串、带有 pongo2.FromFile 的文件或带有pongo2.FromBytes 的字节中读取。

文档使用 Execute、ExecuteWriter 或 ExecuteBytes 函数呈现。这些函数接受一个上下文,它为模板提供常量、变量、实例或函数。

从字符串中读取模板

pongo2.FromString 函数从字符串中读取模板。如下代码将生成一条简单的文本消息:

package main
import (
    "fmt"
    "github.com/flosch/pongo2/v4"
    "log"
)
func main() {
    tpl, err := pongo2.FromString("Hello {{ name }}~")
    if err != nil {
        log.Fatal(err)
    }
    res, err := tpl.Execute(pongo2.Context{"name": "宇宙之一粟"})
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(res)
}

要打印的变量放在 {{ }} 括号内。

tpl, err := pongo2.FromString("Hello {{ name }}!")

接着,我们使用 Execute 渲染最终的字符串。在上下文中,我们为 name 变量传递一个值 “宇宙之一粟”:

res, err := tpl.Execute(pongo2.Context{"name": "宇宙之一粟"})

最后,运行该代码:

$ go run main.go         
Hello 宇宙之一粟~

如下图:

Go web入门Go pongo2模板引擎

再来看一个例子,我们可以传递两个文本:

package main
import (
    "fmt"
    "github.com/flosch/pongo2/v4"
    "log"
)
func main() {
    tpl, err := pongo2.FromString("{{ name }}是{{ occupation }}")
    if err != nil {
        log.Fatal(err)
    }
    name, occupation := "宇宙之一粟", "程序猿?‍?‍"
    ctx := pongo2.Context{"name": name, "occupation": occupation}
    res, err := tpl.Execute(ctx)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(res)
}

运行该代码:

$ go run main.go
宇宙之一粟是程序猿?‍?‍

从文件中读取文本

使用 ​​pongo2.FromFile​​ 函数,我们从文件中读取模板。

新建一个 test.tpl 模板文件:

{{ name }}是{{ occupation }}

该示例生成一条简单的消息,同时从文件中读取模板。写好 main.go 文件:

package main
import (
    "fmt"
    "github.com/flosch/pongo2/v4"
    "log"
)
func main() {
    tpl, err := pongo2.FromFile("test.tpl")
    if err != nil {
        log.Fatal(err)
    }
    name, occupation := "宇宙之一粟", "不掉发的程序猿"
    ctx := pongo2.Context{"name": name, "occupation": occupation}
    res, err := tpl.Execute(ctx)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(res)
}

运行该程序:

$ go run main.go
宇宙之一粟是不掉发的程序猿

Go pongo2 迭代

for 语句用于迭代模板中的数据集合。

新建一个 words.tpl 文件:

{% for word in words -%}
    {{ word }}
{% endfor %}

在模板中,我们使用 for 指令来遍历 words 数据结构的元素。可以用 - 字符去除空白字符。

package main
import (
    "fmt"
    "github.com/flosch/pongo2/v4"
    "log"
)
func main() {
    tpl, err := pongo2.FromFile("words.tpl")
    if err != nil {
        log.Fatal(err)
    }
    words := []string{"只要", "对", "编码", "保持", "热爱", "!"}
    ctx := pongo2.Context{"words": words}
    res, err := tpl.Execute(ctx)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(res)
}

在程序中,我们将一段单词传递给 tempate 引擎。我们得到一个单词列表作为输出。

$ go run main.go
只要
对
编码
保持
热爱
!

Go pongo2 过滤

可以将过滤器应用于数据以修改它们。在 | 之后应用过滤器特点。

更改 words.tpl 文件

{% for word in words -%}
    {{ word }} has {{ word | length }} characters
{% endfor %}

main 文件:

package main
import (
    "fmt"
    "github.com/flosch/pongo2/v4"
    "log"
)
func main() {
    tpl, err := pongo2.FromFile("words.tpl")
    if err != nil {
        log.Fatal(err)
    }
    words := []string{"只要", "对", "编码", "保持", "热爱", "!"}
    ctx := pongo2.Context{"words": words}
    res, err := tpl.Execute(ctx)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(res)
}

在程序中,我们将一段单词传递给模板。我们打印每个单词及其大小。运行该程序:

只要 has 2 characters
对 has 1 characters
编码 has 2 characters
保持 has 2 characters
热爱 has 2 characters
! has 1 characters

Go pongo2 条件

可以使用 if/endif 指令创建条件。

新建一个 todo.tpl 文件:

{% for todo in todos -%}
    {% if todo.Done %}
        {{- todo.Title -}}
    {% endif %}
{% endfor %}

在模板文件中,我们使用 if 指令仅输出已完成的任务。

我们从一片待办事项中生成输出。在输出中,我们仅包含已完成的任务。

package main
import (
    "fmt"
    "github.com/flosch/pongo2/v4"
    "log"
)
type Todo struct {
    Title string
    Done  bool
}
type Data struct {
    Todos []Todo
}
func main() {
    tpl, err := pongo2.FromFile("todo.tpl")
    if err != nil {
        log.Fatal(err)
    }
    todos := []Todo{
        {Title: "看书一小时", Done: false},
        {Title: "写代码五小时", Done: true},
        {Title: "吃饭三餐", Done: true},
        {Title: "不加班", Done: false},
        {Title: "日更写文章", Done: true},
    }
    ctx := pongo2.Context{"todos": todos}
    res, err := tpl.Execute(ctx)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(res)
}

运行代码:

$ go run main.go
写代码五小时
吃饭三餐
日更写文章

总结

这篇文章介绍了第三方模板库 pongo2,pongo2 是一种类似于 Django 语法的 Go 的模板语言。并介绍了从字符串和文件中两种方式获取文本,并介绍了 pongo2 的迭代、过滤和 if 条件的使用,并给出了每个代码案例,希望能对你有帮助。关于 pongo2 的更多用法请参考官方链接,还有更多基于 pongo2 的第三方扩展库,都值得一看,哪个方便用哪个。

Go web入门Go pongo2模板引擎

参考链接:

https://zetcode.com/golang/pongo2/

https://github.com/flosch/pongo2

以上就是Go语言编程入门Go pongo2模板引擎的详细内容!


Tags in this post...

Golang 相关文章推荐
浅谈Golang 嵌套 interface 的赋值问题
Apr 29 Golang
golang slice元素去重操作
Apr 30 Golang
K8s部署发布Golang应用程序的实现方法
Jul 16 Golang
go goroutine 怎样进行错误处理
Jul 16 Golang
Go语言实现Base64、Base58编码与解码
Jul 26 Golang
Go语言实现一个简单的并发聊天室的项目实战
Mar 18 Golang
Golang原生rpc(rpc服务端源码解读)
Apr 07 Golang
golang用type-switch判断interface的实际存储类型
Apr 14 Golang
Golang MatrixOne使用介绍和汇编语法
Apr 19 Golang
深入理解 Golang 的字符串
May 04 Golang
Go语言入门exec的基本使用
May 20 Golang
GoFrame基于性能测试得知grpool使用场景
Jun 21 Golang
Go语言入门exec的基本使用
May 20 #Golang
Golang并发工具Singleflight
May 06 #Golang
深入理解 Golang 的字符串
May 04 #Golang
Golang入门之计时器
May 04 #Golang
Golang 入门 之url 包
May 04 #Golang
Golang解析JSON对象
Apr 30 #Golang
Golang 并发编程 SingleFlight模式
You might like
解析PHP的session过期设置
2013/06/29 PHP
PHP发送邮件确认验证注册功能示例【修改别人邮件类】
2019/11/09 PHP
理解Javascript_05_原型继承原理
2010/10/13 Javascript
通过JavaScript使Div居中并随网页大小改变而改变
2013/06/24 Javascript
使用mouse事件实现简单的鼠标经过特效
2015/01/30 Javascript
jquery中EasyUI实现同步树
2015/03/01 Javascript
浅谈Javascript中的函数、this以及原型
2016/10/09 Javascript
vue2滚动条加载更多数据实现代码
2017/01/10 Javascript
PHP实现记录代码运行时间封装类实例教程
2017/05/08 Javascript
完美实现js拖拽效果 return false用法详解
2017/07/28 Javascript
JS实现的简单表单验证功能示例
2017/10/13 Javascript
微信小程序页面缩放式侧滑效果的实现代码
2018/11/15 Javascript
详解微信小程序实现仿微信聊天界面(各种细节处理)
2019/02/17 Javascript
nodejs中实现用户注册路由功能
2019/05/20 NodeJs
axios异步提交表单数据的几种方法
2019/08/11 Javascript
JavaScript Reflect Metadata实现详解
2019/12/12 Javascript
three.js 利用uv和ThreeBSP制作一个快递柜功能
2020/08/18 Javascript
搭建vscode+vue环境的详细教程
2020/08/31 Javascript
如何利用node转发请求详解
2020/09/17 Javascript
Python实现新浪博客备份的方法
2016/04/27 Python
Python文件与文件夹常见基本操作总结
2016/09/19 Python
python实现图书借阅系统
2019/02/20 Python
Python中psutil的介绍与用法
2019/05/02 Python
python 画3维轨迹图并进行比较的实例
2019/12/06 Python
Python实现简单猜数字游戏
2021/02/03 Python
css3背景_动力节点Java学院整理
2017/07/11 HTML / CSS
html5构建触屏网站之touch事件介绍
2013/01/07 HTML / CSS
美国当红的名品折扣网:Gilt Groupe
2016/08/15 全球购物
NHL官方在线商店:Shop.NHL.com
2020/05/01 全球购物
九年级化学教学反思
2014/01/28 职场文书
销售团队口号大全
2014/06/06 职场文书
违纪学生保证书
2015/02/27 职场文书
新闻通讯稿模板
2015/07/22 职场文书
初二英语教学反思
2016/02/15 职场文书
浅谈golang 中time.After释放的问题
2021/05/05 Golang
Go语言安装并操作redis的go-redis库
2022/04/14 Golang