Go Team Leader — rsc大神新开源了一个库,增强模板功能

polarisxu

共 3239字,需浏览 7分钟

 ·

2021-05-13 23:05

阅读本文大概需要 4 分钟。

大家好,我是站长 polarisxu。

今天给大家分享一个 rsc 新开源的一个库:rsc.io/tmplfunc。

这个库是对 Go 标准库模板的扩展,可以像调用函数一样调用模板。通过一个例子看怎么使用。

01 标准库

因为 text/template 和 html/template 基本是一样的,且 tmplfunc 这个包同时支持两者,本文使用 text/template 来演示。

有如下代码:

package main

import (
 "os"
 "text/template"
)

var stdstr = `{{link "https://golang.org" "The Go language"}}
{{link "https://studygolang.com" "Go语言中文网"}}
`


func main() {
 testStdlib()
}

func testStdlib() {
 funcMap := template.FuncMap{
  "link"func(url, title string) string {
   return `<a href="` + url + `">` + title + `</a>`
  },
 }
 t, err := template.New("tmplstd").
  Funcs(funcMap).
  Parse(stdstr)
 if err != nil {
  panic(err)
 }

 err = t.Execute(os.Stdout, nil)
 if err != nil {
  panic(err)
 }
}

这个例子在 Go 代码中定义了一个模板函数,构造一个 URL 链接。在模板中,通过调用这个函数生成 URL,达到了复用的目的。以上代码输出:

<a href="https://golang.org">The Go language</a>
<a href="https://studygolang.com">Go语言中文网</a>

02 使用 rsc.io/tmplfunc

现在使用 rsc.io/tmplfunc 这个库改写这个例子,代码如下:

package main

import (
 "os"
 "text/template"

 "rsc.io/tmplfunc"
)

var tmplstr = `{{define "link url text"}}<a href="{{.url}}">{{.text}}</a>{{end}}
{{link "https://golang.org" "The Go language"}}
{{link "https://studygolang.com" "Go语言中文网"}}
`


func main() {
 testTmplfunc()
}

func testTmplfunc() {
 t := template.New("tmplfunc")
 err := tmplfunc.Parse(t, tmplstr)
 if err != nil {
  panic(err)
 }

 err = t.Execute(os.Stdout, nil)
 if err != nil {
  panic(err)
 }
}
  • 主意 tmplstr 这个变量的内容,相比标准库版本多了这一句 {{define "link url text"}}<a href="{{.url}}">{{.text}}</a>{{end}},这其实是定义模板的语法,tmplfunc 重用了它。link 可以理解为函数,url 和 text 理解为函数的参数。
  • 在 testTmplfunc 函数中,得到 template 实例后,没有直接调用其 Parse 方法,而是调用了 tmplfunc 的函数 Parse,并将 template 的实例作为第一参数传递。

其他的和标准库没有区别。运行后输出是一样的。

03 学习更多

通过上面的例子,基本上我们已经掌握了该包的用法,同时也可以看出,该包让模板重用在模板页面完成,而不需要在 Go 代码中进行,目前我能想到的使用场景不多,但知晓有这么个库,也许在实际中有这样的需求。

关于该包,需要额外补充一点。在 define 定义时,除了上面例子的形式,还支持可选参数。可选参数通过 ? 表示,如:

{{define "link url text?"}}<a href="{{.url}}">{{or .text .url}}</a>{{end}}

还支持可变参数,这和 Go 的语法一样,通过三个点表示:

{{define "myprint names..."}}
 {{range .names}}
  {{.}}
 {{end}}
{{end}}
{{myprint "polarisxu" "studygolang"}}

定义是注意顺序:普通参数、可选参数、可变参数。

关于标准库中对应的 Parse,该库提供了对应的函数,具体可以查看文档:https://pkg.go.dev/rsc.io/tmplfunc

密切关注大神的动态,努力跟随大神的步伐~加油!!!




往期推荐


我是 polarisxu,北大硕士毕业,曾在 360 等知名互联网公司工作,10多年技术研发与架构经验!2012 年接触 Go 语言并创建了 Go 语言中文网!著有《Go语言编程之旅》、开源图书《Go语言标准库》等。


坚持输出技术(包括 Go、Rust 等技术)、职场心得和创业感悟!欢迎关注「polarisxu」一起成长!也欢迎加我微信好友交流:gopherstudio


浏览 51
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报