返回

Go 模板中的参数、变量、管道与函数

发布时间:2022-12-03 18:52:52 394
# html# php

Go 模板中的参数、变量、管道与函数_内置函数

参数

Go 模板中的参数、变量、管道与函数_自定义函数_02


参数就是模板里面用到的值。它的取值有多种,可以是布尔值、字符串、字符、整数、浮点数、虚数和复数等字面量,也可以是结构体、结构体中的一个字段或 map 中的一个键(结构体的字段名必须是导出的,即大写字母开头,map 的键名则不必),还可以是变量、方法(返回单个值或返回一个值和一个错误)或函数(返回单个值或返回一个值和一个错误)。参数还可以是一个点 ​​.​​ ,也就是传入模板引擎的那个值。

例如上一期讲到的条件 Action 中的 ​​arg​​ 就是参数:

{{ if arg }}
some content
{{ end }}

Go 模板中的参数、变量、管道与函数_内置函数

变量

Go 模板中的参数、变量、管道与函数_自定义函数_02


在 Action 中可以设置变量,变量以 ​​$​​ 开头,例如:

$variable := value

声明变量的 Action 不产生输出。变量可以重新被赋值:

$variable = value

在迭代/遍历类 Action 中可以定义两个变量:

{{ range $key, $value := . }}
The key is {{ $key }} and the value is {{ $value }}
{{ end }}

这样就可以在循环中通过 ​​$key​​​ 和 ​​$value​​ 访问索引和元素了。


Go 模板中的参数、变量、管道与函数_内置函数

管道

Go 模板中的参数、变量、管道与函数_自定义函数_02


管道和 Unix 中的管道类似,是按顺序连接到一起的参数、函数和方法。例如:

{{ p1 | p2 | p3 }}

p1、p2、p3 要么是参数,要么是(可能带有参数的)函数调用或方法调用。管道允许我们把命令的结果作为下一个命令的最后一个参数,下一个参数由管道 ​​|​​ 分隔开。下面是一个例子,模板如下:


<html lang="en">
<head>
<meta charset="UTF-8">
<title>Pipelinetitle>
head>
<body>
{{ 3.1415926 | printf "%.2f" }}
body>
html>

其中 ​​printf​​ 是 Go 模板内置的函数,Go 代码如下:

package main

import (
"html/template"
"net/http"
)

func main() {
server := http.Server{
Addr: "localhost:8080",
}
http.HandleFunc("/action", func (w http.ResponseWriter, r *http.Request) {
t, _ := template.ParseFiles("template.html")
t.Execute(w, "Go")
})
server.ListenAndServe()
}

运行程序并访问 ​​http://localhost:8080/action​​​ 可以看到显示结果为 ​​3.14​​ ,结果进行了四舍五入。


Go 模板中的参数、变量、管道与函数_内置函数

函数

Go 模板中的参数、变量、管道与函数_自定义函数_02


Go 模板提供了大量的内置函数,如果有特殊需求也可以实现自定义函数。模板执行时,遇到函数调用,先从模板自定义函数表中查找,而后查找全局函数表。

内置函数

内置函数分为以下几类:

  • 逻辑运算:and 、 or 、 not
  • 比较运算:eq 、 ne 、 lt 、 le 、 gt 、 ge
  • 组合模板函数:define 、 template 、 block
  • 调用操作:call
  • 格式化操作:print 、 printf 、 println ,与用参数直接调用 fmt.Sprint/Sprintf/Sprintln 得到的内容相同
  • 转义:html、js、urlquery 函数对字符串进行转义,防止安全问题。如果是 Web 模板,那么不会需要经常使用这些函数

自定义函数

默认情况下,模板中无自定义函数,可以使用模板的 ​​Funcs​​​ 方法添加。​​Funcs​​ 方法如下:

template.Funcs(funcMap FuncMap) *Template

其中 ​​FuncMap​​ 类型如下:

type FuncMap map[string]interface{}

map 中的 ​​value​​ 是函数,这些函数可以有任意数量的参数,返回单个值的函数或返回一个值加上一个错误的函数。

那么要如何创建自定义函数呢?首先,创建一个 ​​FuncMap​​​ (map 类型),其中 ​​key​​​ 是函数名, ​​value​​​ 就是函数。然后把 ​​FuncMap​​ 附加到模板即可。例如:

package main

import (
"html/template"
"net/http"
"time"
)

func main() {
server := http.Server{
Addr: "localhost:8080",
}
http.HandleFunc("/action", func (w http.ResponseWriter, r *http.Request) {
// 创建 FuncMap
// key 为函数名 fdate
// value 为函数 formatDate
funcMap := template.FuncMap{"fdate": formatDate}
// 创建新模板 模板名为 template.html
t := template.New("template.html").Funcs(funcMap)
// 解析模板
t.ParseFiles("template.html")
// 执行时传入现在的时间
t.Execute(w, time.Now())
})
server.ListenAndServe()
}

// formatDate 对时间进行格式化函数
func formatDate(t time.Time) string {
layout := "2006-01-02"
return t.Format(layout)
}

template.html 如下,其中 ​​fdate​​​ 是我们自定义的函数,函数名是 ​​map​​​ 中的 ​​key​​ :


<html lang="en">
<head>
<meta charset="UTF-8">
<title>Pipelinetitle>
head>
<body>
{{ . | fdate }}
body>
html>

运行程序并访问 ​​http://localhost:8080/action​​ 可以看到显示的是当前的日期。上面的例子我们是在管道中使用了自定义函数,当然,我们也可以作为正常函数使用。




特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线
下一篇
Go Web 模板简介 2022-12-03 18:18:27