前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >了解Go Template 语法,构建高效文本输出

了解Go Template 语法,构建高效文本输出

作者头像
希里安
发布2024-05-11 17:38:30
1180
发布2024-05-11 17:38:30
举报
文章被收录于专栏:希里安希里安

聊点别的

五一假期一转眼都过去了,都快一周了,各位怎么样啊?最近也比较忙,除了处理家中的一些事务,还需要适应一些工作内容,所以文章更新的比较慢了,请各位读者见谅。大家有什么好的内容或者见闻都可以留言分享哦。

近日见闻

  1. Visual Studio Code 1.89 发布,更新包括将鼠标悬停在链接上可预览 Markdown 中的图像和视频。--vscode
  2. Apple 发布 M4 芯片,首搭于 2024 款 iPad Pro。--Apple
  3. Electron v30.0.3 发布,跨平台桌面应用开发工具 --Oschina
  4. 摘抄:
代码语言:javascript
复制
世上只有一种英雄主义,

就是在认清生活真相之后依然热爱生活。


——罗曼·罗兰


今日推荐

开发人员快速参考备忘清单【速查表】。基本覆盖了全技术栈,大家快去看看啊!https://cheatsheets.zip/

Go Template 语法

Go语言的模板引擎是一种轻量级的模板系统,它允许开发者将数据和模板结合起来,生成最终的文本输出。模板引擎通常用于生成HTML、配置文件、电子邮件等文本格式。Go语言的标准库提供了两个模板包:text/templatehtml/template,后者增加了对HTML输出的安全处理。

模板语法

Go模板的基本语法非常简洁,主要包括以下几个部分:

  1. 文本输出:模板中的普通文本会被直接输出。
  2. 变量:使用{{ .FieldName }}来输出结构体或map中的字段值。
  3. 控制结构:包括条件语句和循环语句。
  4. 函数调用:可以在模板中调用定义的函数。
  5. 注释:模板中的注释不会被输出。

示例

下面是一个简单的模板示例,展示了如何使用Go模板:

代码语言:javascript
复制
package main

import (
 "os"
 "text/template"
)

type Person struct {
 Name string
 Age  int
}

func main() {
 tmpl := template.Must(template.New("example").Parse(`
Hello, {{ .Name }}!
You are {{ .Age }} years old.
`))

 p := Person{Name: "Alice", Age: 30}
 tmpl.Execute(os.Stdout, p)
}

在这个例子中,我们创建了一个名为example的模板,并定义了一个Person结构体。模板中使用了.Name.Age来输出Person结构体的字段值。

控制结构

Go模板支持以下控制结构:

  • 条件语句{{ if .Condition }} ... {{ end }}
  • 循环语句{{ range .List }} ... {{ end }}

函数调用

模板可以调用函数来处理数据。函数可以是内置的,也可以是自定义的。例如,printf是一个内置函数,用于格式化输出:

代码语言:javascript
复制
{{ printf "%s is %d years old" .Name .Age }}

注释

模板中的注释使用{{/* 注释内容 */}}语法,注释内容不会被输出。

模板基础

模板是一个字符串或文件,它包含固定的内容和一些特殊的模板语法,这些语法在执行时会被替换为相应的数据。模板可以包含以下元素:

  • 纯文本:直接输出到结果中。
  • 变量:使用.来访问传入模板的数据。
  • 管道(Pipeline):一系列的动作,例如{{ .Name | html }},其中html是一个函数,用于处理Name字段的值。
  • 控制结构:如ifrangewith等。
  • 函数:模板可以调用预定义的函数。
  • 注释:模板中的注释不会被输出。

模板动作

模板动作是模板中的一种特殊语法,用于执行某些操作,如条件判断、循环等。以下是一些常见的模板动作:

  • {{ . }}:点操作符,用于访问传入模板的数据。
  • {{ if .Condition }} ... {{ end }}:条件语句,如果Condition为真,则执行其中的内容。
  • {{ range .List }} ... {{ end }}:循环语句,遍历List中的每个元素并执行其中的内容。
  • {{ with .Value }} ... {{ end }}:设置点操作符的值为Value,在...中的操作将使用这个新值。

管道

管道允许你将多个动作串联起来,就像Unix命令行中的管道一样。例如:

代码语言:javascript
复制
{{ .Name | title | printf "%s" }}

在这个例子中,title函数将Name转换为首字母大写,然后printf函数将其输出。

模板嵌套

模板可以嵌套使用,这允许你创建复杂的模板结构。例如,你可以定义一个基础模板,然后在其中包含其他模板:

代码语言:javascript
复制
{{ define "base" }}
<html>
<body>
{{ template "content" . }}
</body>
</html>
{{ end }}

{{ define "content" }}
<p>Hello, {{ .Name }}!</p>
{{ end }}

在这个例子中,base模板定义了整个HTML文档的结构,并包含了一个名为content的子模板。

去除空白

template引擎在进行替换的时候,是完全按照文本格式进行替换的。除了需要评估和替换的地方,所有的行分隔符、空格等等空白都原样保留。所以,对于要解析的内容,不要随意缩进、随意换行。

可以在{{符号的后面加上短横线并保留一个或多个空格"- "来去除它前面的空白(包括换行符、制表符、空格等),即{{- xxxx

}}的前面加上一个或多个空格以及一个短横线"-"来去除它后面的空白,即xxxx -}}

安全处理

html/template包提供了对HTML输出的安全处理,可以自动转义特殊字符,防止XSS攻击。例如:

代码语言:javascript
复制
tmpl := template.Must(template.New("example").Parse(`
<p>Hello, {{ .Name }}!</p>
`))

在这个例子中,如果Name字段包含HTML特殊字符,html/template会自动转义这些字符,确保输出的HTML是安全的。

自定义函数

除了内置函数,你还可以定义自己的函数,并将其添加到模板中。例如:

代码语言:javascript
复制
func sayHello(name string) string {
 return "Hello, " + name + "!"
}

tmpl := template.Must(template.New("example").Funcs(template.FuncMap{
 "sayHello": sayHello,
}).Parse(`
{{ sayHello .Name }}
`))

在这个例子中,我们定义了一个名为sayHello的函数,并将其添加到模板中。

总结

Go语言的模板系统是一个强大而灵活的工具,它允许开发者以声明式的方式生成文本输出。通过组合文本、变量、控制结构、函数调用和注释,可以创建出复杂的模板来满足不同的需求。html/template包还提供了额外的安全特性,使得处理HTML输出更加安全。理解和熟练使用Go模板系统对于构建Web应用和其他需要文本生成的应用至关重要

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-05-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 希里安 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 聊点别的
  • 近日见闻
  • 今日推荐
  • Go Template 语法
    • 模板语法
      • 示例
        • 控制结构
          • 函数调用
            • 注释
              • 模板基础
                • 模板动作
                  • 管道
                    • 模板嵌套
                      • 去除空白
                        • 安全处理
                          • 自定义函数
                            • 总结
                            领券
                            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档