golang公式引擎_Golang的template(模板引擎)简明教程

原文可见: https://jiajunhuang.com/articles/2019_08_23-golang_html_template.md.html

模板语言,在前后端分离的时代,大概可以归类到上古时代的技术了。不过前后端分离并不是银弹(而且也只是

把模板从后端移到前端而已),它也有很多问题:

- SEO

- 需维护两套程序

- ...

模板语言仍然有它的用处,例如我的博客部署在一台512M的小机器上,起两套程序不仅写起来麻烦,而且内存占用

大,部署也不方便。

Go语言的模板与大多数语言一样,是用 `{{` 和 `}}` 来做标识,`{{ }}` 里可以是表达式,也可以是变量,不过

Go语言的模板比较简陋,没办法像Python中 `jinja2` 那样使用继承的写法,而只能是用拼接的写法。

举个例子,看看这个博客的模板(https://github.com/jiajunhuang/blog/tree/master/templates):

```html

{{ block "header.html" . }}{{ end }}

{{ .content }}

{{ block "footer.html" . }}{{ end }}

```

这是渲染这篇博客的模板,很明显,它由三部分组成:

- `header.html` 这是顶栏

- `{{ .content }}` 这是内容

- `footer.html` 这是右侧边栏和底部

它的写法,就是把一个完整的HTML页面拆成几个部分,然后进行拼装。有点像这样的意思:

```go

function renderHeader() {

renderNavbar()

renderPartOfBody()

}

function renderContent() {

renderContentBody()

}

function renderFooter() {

renderPartOfBody()

renderSidebar()

renderBottom()

}

renderHeader()

renderContent()

renderFooter()

```

接下来我们来看看具体的语法:

- 使用 `{{ define "layout" }}{{ end }}` 来定义一个块,这个块的名字就是 "layout",如果不使用 `define`,那么名字就是文件名

- 使用 `{{ block "template filename" . }} {{ end }}` 来调用一个模板,就像上面的例子中,调用一个函数那样,其中 `.` 也可以是变量名等等,就是引用变量的上下文,如果我们传入 `.`,那么子模板里可以访问的变量就和当前可以访问的上下文一样

- `{{ range $i := .items }} {{ end }}` 相当于Go语言里的 `for i := range items`

- `{{ if .items }}` 相当于Go语言里的 `if items`,完整的是 `{{if pipeline}} T1 {{else if pipeline}} T0 {{end}}`

- `{{ .variable }}` 渲染 `variable` 的值

- `{{/* a comment */}}` 是注释

- `{{- /* a comment with white space trimmed from preceding and following text */ -}}` 可以跨行的注释

当然,还有个比较坑的地方在于,Go会自动把输出进行转义,渲染的时候如果想要不转义,就使用 `template.HTML("blablabla")`,这里的 `template` 就是导入的包 `html/template`。

例如,这个博客输出RSS的Controller是这样的:

```go

// RSSHandler RSS

func RSSHandler(c *gin.Context) {

c.Header("Content-Type", "application/xml")

c.HTML(

http.StatusOK, "rss.html", gin.H{

"rssHeader": template.HTML(`<?xml version="1.0" encoding="UTF-8"?>`),

"articles": articles,

},

)

}

```

模板是这样的:

```xml

{{ .rssHeader }}

Jiajun的编程随想

https://jiajunhuang.com

Jiajun的编程随想

{{ range $article := .articles }}

{{ .Title }}

https://jiajunhuang.com/{{ .DirName }}/{{ .Filename }}.html

{{ .Title }}

{{ end }}

```

这样才成功的避免了XML的第一个尖括号 `

---

参考资料:

- https://golang.org/pkg/text/template/

有疑问加站长微信联系(非本文作者))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值