01-注释、作用域、空格和空行、管道
1.strings包2.envconfig包(读取环境变量)3.gocron包(定时任务)4.go-redis包5.net/http包实战6.net/http包Client的使用7.01-判断正则匹配、判断正则合法性8.02-查找正则匹配字串、查找正则匹配字串的位置9.03-查找匹配字串,查找匹配字串位置,正则分组10.04-使用正则替换11.06-其他用法
12.01-注释、作用域、空格和空行、管道
13.02-变量、if语句、迭代、内置函数14.01-入门示例、工作簿、文件Writer15.02-工作表操作16.03-行和列操作17.04-迭代器18.05-单元格操作19.06-样式设置20.07-流式写入21.01-Gauge(仪表盘)22.02-Counter(计数器)23.03-HIstogram(直方图)24.04-Summary(摘要)目录
1. 注释 {{/* xxxx */}}
{{/* xxxx */}}
2. 作用域
2.1 顶级作用域 {{ . }}
- 代码
package main import ( "html/template" "os" ) type Person struct { Name string Age int64 } func main() { p := Person{"GuanYu",25} tmpl := template.New("test") tmpl = template.Must(tmpl.Parse("Name: {{.Name}}, Age: {{.Age}}\nAll: {{.}}")) _ = tmpl.Execute(os.Stdout, p) }
- 输出
Name: GuanYu, Age: 25 All: {GuanYu 25}
这里
{{.Name}}
和{{.Age}}
中的点"."代表的是顶级作用域的对象p,所以Execute()
方法执行的时候,会将{{.Name}}
替换成p.Name
,同理{{.Age}}
替换成{{p.Age}}
。
- 另一种写法
模板换行我们也可以不写
\n
,而用"反引号"代替"引号"
package main import ( "html/template" "os" ) type Person struct { Name string Age int64 } func main() { p := Person{"GuanYu",25} tmpl := template.New("test") tmpl = template.Must(tmpl.Parse(` Name: {{.Name}} Age: {{.Age}} All {{ . }} `)) _ = tmpl.Execute(os.Stdout, p) }
结果显示
Name: GuanYu Age: 25 All {GuanYu 25}
2.2 相对作用域 {{range . }} xxxx {{end}}
{{range . }} xxxx {{end}}
- 完整代码
package main import ( "os" "text/template" ) type Weapon struct { WeaponName string Attack int } type User struct { UserName string Weapons []Weapon Wives []string } func main() { t := template.New("test") t = template.Must(t.Parse( `姓名:{{.UserName}} {{- range .Weapons }} 武器: {{.WeaponName}} {{- end }} {{- range .Wives }} 妻子: {{ . }} {{- end }}`)) WeaponL := Weapon{WeaponName:"双股剑(雄)" } WeaponR := Weapon{WeaponName:"双股剑(雌)" } p := User{UserName: "刘备", Weapons: []Weapon{WeaponL,WeaponR}, Wives: []string{"甘夫人","糜夫人","孙尚香"}} t.Execute(os.Stdout, p) }
- 输出
姓名:刘备 武器: 双股剑(雄) 武器: 双股剑(雌) 妻子: 甘夫人 妻子: 糜夫人 妻子: 孙尚香
说明:
- template开始时,顶级作用域在
p
,因此{{- range .Weapons }}
可指向p.Weapons
- 而进入range循环后则进入一个
p.Weapons
内的相对域,因此{{.WeaponName}}
指向了绝对位置p.Weapons.WeaponName
- 后边
妻子的循环与此相同
2.3 切换作用域 {{with .xxx }} xxx {{end}}
- 代码
package main import ( "os" "text/template" ) type Weapon struct { WeaponName string Attack int } type User struct { UserName string Weapons []Weapon Wives []string } func main() { t := template.New("test") t = template.Must(t.Parse( `姓名:{{.UserName}} {{- with .Weapons }} {{- range . }} 武器: {{.WeaponName}} {{- end }} {{- end }} {{- range .Wives }} 妻子: {{ . }} {{- end }}`)) WeaponL := Weapon{WeaponName:"双股剑(雄)" } WeaponR := Weapon{WeaponName:"双股剑(雌)" } p := User{UserName: "刘备", Weapons: []Weapon{WeaponL,WeaponR}, Wives: []string{"甘夫人","糜夫人","孙尚香"}} t.Execute(os.Stdout, p) }
- 显示结果
姓名:刘备 武器: 双股剑(雄) 武器: 双股剑(雌) 妻子: 甘夫人 妻子: 糜夫人 妻子: 孙尚香
说明:
- template开始时,顶级作用域在
p
- 而
{{ with .Weapons }}
开始到第二个{{- end }}
之间,顶级作用域切换到p..Weapons
因此其中的{{- range . }}
则在p.Weapons
中循环(而不是p
)- 到切换作用域结束后(第二个
{{- end }}
),依然使用{{- range .Wives }}
指到p..Wives
3. 去空格和去空行 {{- xxx}}
3.1 去空行
- 之前“1.2”中的例子中我们可以看见很多
-
,比如{{- range . }}
,{{- end }}
,这些是为了消除空行,其输出如下:
姓名:刘备 武器: 双股剑(雄) 武器: 双股剑(雌) 妻子: 甘夫人 妻子: 糜夫人 妻子: 孙尚香
{{- range . }}
和{{range . }}
如果我们将第一个range修改为{{range . }}
t = template.Must(t.Parse( `姓名:{{.UserName}} {{- with .Weapons }} {{range . }} 武器: {{.WeaponName}} {{- end }} {{- end }} {{- range .Wives }} 妻子: {{ . }} {{- end }}`))
则输出如下:
姓名:刘备 武器: 双股剑(雄) 武器: 双股剑(雌) 妻子: 甘夫人 妻子: 糜夫人 妻子: 孙尚香
我们可以看到,在第一个range的位置出现了一个空行。
{{- end}}
和{{end }}
如果我们将第一个end处改为{{end }}
t = template.Must(t.Parse( `姓名:{{.UserName}} {{- with .Weapons }} {{range . }} 武器: {{.WeaponName}} {{end }} {{- end }} {{- range .Wives }} 妻子: {{ . }} {{- end }}`))
- 则输出如下:
姓名:刘备 武器: 双股剑(雄) 武器: 双股剑(雌) 妻子: 甘夫人 妻子: 糜夫人 妻子: 孙尚香
可见,每次循环读取都会因end产生一个空行。
3.2 去空格
- 我们在
妻子
和值之间加很多空格妻子: {{ . }}
:
package main import ( "os" "text/template" ) type Weapon struct { WeaponName string Attack int } type User struct { UserName string Weapons []Weapon Wives []string } func main() { t := template.New("test") t = template.Must(t.Parse( `姓名:{{.UserName}} {{- with .Weapons }} {{range . }} 武器: {{.WeaponName}} {{- end }} {{- end }} {{- range .Wives }} 妻子: {{ . }} {{- end }}`)) WeaponL := Weapon{WeaponName:"双股剑(雄)" } WeaponR := Weapon{WeaponName:"双股剑(雌)" } p := User{UserName: "刘备", Weapons: []Weapon{WeaponL,WeaponR}, Wives: []string{"甘夫人","糜夫人","孙尚香"}} t.Execute(os.Stdout, p) }
则结果如下:
姓名:刘备 武器: 双股剑(雄) 武器: 双股剑(雌) 妻子: 甘夫人 妻子: 糜夫人 妻子: 孙尚香
- 现在我们去掉这些空格,以上代码修改如下:
修改为
妻子: {{- . }}
t = template.Must(t.Parse( `姓名:{{.UserName}} {{- with .Weapons }} {{range . }} 武器: {{.WeaponName}} {{- end }} {{- end }} {{- range .Wives }} 妻子: {{- . }} {{- end }}`))
则结果为:
姓名:刘备 武器: 双股剑(雄) 武器: 双股剑(雌) 妻子:甘夫人 妻子:糜夫人 妻子:孙尚香
如果是
{{ xxxx }}
后边有空格,则将-
写在右侧{{ xxxx -}}
4. 管道 {{ | }}
将前边的结果传给后边最后一个位置
- 代码
package main import ( "os" "text/template" ) func main() { t := template.New("xiShu") t = template.Must(t.Parse( `{{printf "%q" "关羽"}} {{"关羽" | printf "%q"}} {{"关羽" | printf "%q" | printf "%q"}}`)) p := "" t.Execute(os.Stdout, p) }
- 结果
"关羽" "关羽" "\"关羽\""
说明:
- 第一个正常打印关羽
- 第二个将关羽通过管道符传到后边的最后一个位置
- 第三个,有两个管道符,依次处理,因此加了两层引号(
%q
是带引号打印,处理一次加一层)
分类:
go语言开发 / go的其他用法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了