查看“Go网络编程-Templates”的源代码
←
Go网络编程-Templates
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
<span id="简介-1"></span> == 简介 == Go的html/template包提供了一种丰富的HTML模板语言。它主要用于Web应用程序中,以结构化的方式在客户端浏览器中显示数据。Go模板语言的一个巨大优势是数据的自动转义。无需担心XSS攻击,因为Go会解析HTML模板并在将其显示到浏览器之前转义所有输入。 <br> == 第一个模板 == 在Go中编写模板非常简单。这个示例展示了一个待办事项列表,用HTML中的无序列表(ul)表示。在渲染模板时,传入的数据可以是任何类型的Go数据结构。它可以是简单的字符串或数字,甚至可以是下面示例中的嵌套数据结构。要在模板中访问数据,可以通过{{.}}访问最顶层变量。花括号内的点称为管道和数据结构的根元素。 <syntaxhighlight lang="go">data := TodoPageData{ PageTitle: "My TODO list", Todos: []Todo{ {Title: "Task 1", Done: false}, {Title: "Task 2", Done: true}, {Title: "Task 3", Done: true}, }, }</syntaxhighlight> <br> <syntaxhighlight lang="html"><h1>{{.PageTitle}}</h1> <ul> {{range .Todos}} {{if .Done}} <li class="done">{{.Title}}</li> {{else}} <li>{{.Title}}</li> {{end}} {{end}} </ul></syntaxhighlight> <br> == 控制结构 == 模板语言包含一组丰富的控制结构来渲染你的HTML。在这里,你将了解到最常用的一些。要获取所有可能结构的详细列表,请访问:[https://pkg.go.dev/text/template#hdr-Actions text/template] <br> {| class="wikitable" |- ! Control Structure ! Definition |- | <pre>{{/* a comment */}}</pre> | Defines a comment |- | <pre>{{.}}</pre> | Renders the root element |- | <pre>{{.Title}}</pre> | Renders the “Title”-field in a nested element |- | <pre>{{if .Done}} {{else}} {{end}}</pre> | Defines an if-Statement |- | <pre>{{range .Todos}} {{.}} {{end}}</pre> | Loops over all “Todos” and renders each using {{.}} |- | <pre>{{block “content” .}} {{end}}</pre> | Defines a block with the name “content” |} <br> == 从文件解析模板 == 模板可以从字符串或磁盘上的文件中解析。通常情况是,模板是从磁盘上解析的,因此这个示例展示了如何这样做。在这个示例中,有一个与Go程序位于同一目录的模板文件layout.html。 <syntaxhighlight lang="go">tmpl, err := template.ParseFiles("layout.html") // or tmpl := template.Must(template.ParseFiles("layout.html"))</syntaxhighlight> <br> == 在请求处理器中执行模板 == 一旦从磁盘解析了模板,它就可以在请求处理器中使用了。Execute函数接受一个io.Writer用于输出模板和一个interface{}用于将数据传递给模板。当函数在http.ResponseWriter上调用时,HTTP响应的Content-Type标头会自动设置为Content-Type: text/html; charset=utf-8。 <syntaxhighlight lang="go">func(w http.ResponseWriter, r *http.Request) { tmpl.Execute(w, "data goes here") }</syntaxhighlight> <br> <span id="完整代码-2"></span> == 完整代码 == <syntaxhighlight lang="go">package main import ( "html/template" "net/http" ) type Todo struct { Title string Done bool } type TodoPageData struct { PageTitle string Todos []Todo } func main() { tmpl := template.Must(template.ParseFiles("layout.html")) http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { data := TodoPageData{ PageTitle: "My TODO list", Todos: []Todo{ {Title: "Task 1", Done: false}, {Title: "Task 2", Done: true}, {Title: "Task 3", Done: true}, }, } tmpl.Execute(w, data) }) http.ListenAndServe(":80", nil) }</syntaxhighlight> <br> <syntaxhighlight lang="html"><h1>{{.PageTitle}}</h1> <ul> {{range .Todos}} {{if .Done}} <li class="done">{{.Title}}</li> {{else}} <li>{{.Title}}</li> {{end}} {{end}} </ul></syntaxhighlight> <br>
返回至“
Go网络编程-Templates
”。
导航菜单
个人工具
登录
命名空间
页面
讨论
大陆简体
查看
阅读
查看源代码
查看历史
更多
搜索
导航
首页
基础知识
正则表达式
Markdown
分布式
项目管理
系统集成项目管理基础知识
云原生
Docker
云原生安全
云原生词汇表
十二因素应用
Kubernetes
音频处理
音频合成
Edge-tts
CMS系统
Docsify
VuePress
Mediawiki
自动生成
Marp
CI/CD
GitLab
设计
颜色
平面设计
AI
数字人
操作系统
GNU/Linux
数据库
Mysql
工具
链入页面
相关更改
特殊页面
页面信息