boxmoe_header_banner_img

Hello! 欢迎来到悠悠畅享网!

文章导读

Golang模板渲染HTML页面方法


avatar
作者 2025年9月16日 12
&lt;blockquote&gt;答案:golang通过html/template包实现安全高效的HTML渲染,支持数据填充、循环条件逻辑及自定义函数。&lt;/blockquote&gt; &lt;p&gt;&lt;img src=&quot;https://img.php.cn/upload/article/000/969/633/175800804629862.jpeg&quot; alt=&quot;golang模板渲染html页面方法&quot;&gt;&lt;/p&gt; &lt;p&gt;Golang渲染HTML页面,核心就是利用其内置的&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;html/template&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;包,通过解析预定义的模板文件,并将Go程序中的数据结构动态填充进去,最终生成完整的HTML响应发送给客户端。这个过程高效且安全,特别是在处理用户输入时能有效防止xss攻击,我个人觉得,它在Web开发中扮演着一个既强大又低调的角色,远比一些&lt;a style=&quot;color:#f60; text-decoration:underline;&quot; title=&quot;前端&quot; href=&quot;https://www.php.cn/zt/15813.html&quot; target=&quot;_blank&quot;&gt;前端&lt;/a&gt;框架的模板引擎来得直接和可靠。&lt;/p&gt; &lt;h3&gt;解决方案&lt;/h3&gt; &lt;p&gt;在Golang中渲染HTML页面,最直接的方法就是使用&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;html/template&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;包。它允许你定义带有占位符的HTML文件,然后在Go代码中将数据填充到这些占位符中。下面是一个基本的示例,展示了如何设置一个HTTP服务器来渲染一个简单的HTML页面。&lt;/p&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=’brush:go;toolbar:false;’&gt;package main import ( &amp;quot;html/template&amp;quot; &amp;quot;log&amp;quot; &amp;quot;net/http&amp;quot; ) // 定义一个结构体来承载要传递给模板的数据 type PageData struct { Title String Message string Items []string } func handler(w http.ResponseWriter, r *http.Request) { // 解析模板文件。这里使用了Must函数,如果解析失败会panic, // 这在开发阶段很有用,可以快速发现模板错误。 // 在生产环境中,你可能需要更优雅的错误处理。 tmpl, err := template.ParseFiles(&amp;quot;templates/index.html&amp;quot;) if err != nil { http.Error(w, &amp;quot;Error loading template: &amp;quot;+err.Error(), http.StatusInternalServerError) return } // 准备要传递给模板的数据 data := PageData{ Title: &amp;quot;Golang 模板渲染&amp;quot;, Message: &amp;quot;欢迎来到我的Golang Web页面!&amp;quot;, Items: []string{&amp;quot;Go&amp;quot;, &amp;quot;HTML&amp;quot;, &amp;quot;css&amp;quot;, &amp;quot;JavaScript&amp;quot;}, } // 执行模板,将数据填充进去,并将结果写入HTTP响应。 // html/template会自动对数据进行HTML转义,防止XSS攻击。 err = tmpl.Execute(w, data) if err != nil { http.Error(w, &amp;quot;Error executing template: &amp;quot;+err.Error(), http.StatusInternalServerError) return } } func main() { // 创建一个简单的HTTP服务器 http.HandleFunc(&amp;quot;/&amp;quot;, handler) log.Println(&amp;quot;Server starting on :8080&amp;quot;) err := http.ListenAndServe(&amp;quot;:8080&amp;quot;, nil) if err != nil { log.Fatal(&amp;quot;ListenAndServe: &amp;quot;, err) } } // 假设我们有一个名为 &amp;quot;templates/index.html&amp;quot; 的文件,内容如下: /* <!DOCTYPE html> <html lang=&amp;quot;en&amp;quot;> <head> <meta charset=&amp;quot;UTF-8&amp;quot;> <meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;> <title>{{.Title}}</title> <style> body { font-family: Arial, sans-serif; margin: 20px; } ul { list-style-type: disc; margin-left: 20px; } </style> </head> <body> <h1>{{.Message}}</h1> <p>以下是一些相关技术:</p> <ul> {{range .Items}} <li>{{.}}</li> {{end}} </ul> </body> </html> */&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;在这个例子中,&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;template.ParseFiles&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;负责加载并解析&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;index.html&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;模板。&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;tmpl.Execute(w, data)&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;是关键一步,它将&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;PageData&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;结构体中的数据填充到模板的相应位置,然后将最终生成的HTML写入到&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;http.ResponseWriter&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;中。我个人在项目里经常会把模板文件放到一个独立的&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;templates&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;目录,然后用&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;template.ParseGlob(&amp;quot;templates/*.html&amp;quot;)&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;一次性加载所有模板,这样管理起来更方便。&lt;/p&gt; &lt;h3&gt;为什么Golang的&lt;a style=&quot;color:#f60; text-decoration:underline;&quot; title=&quot;html&quot; href=&quot;https://www.php.cn/zt/15763.html&quot; target=&quot;_blank&quot;&gt;html&lt;/a&gt;/template能有效防止XSS攻击?&lt;/h3&gt; &lt;p&gt;Golang的&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;html/template&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;包在设计之初就将安全性放在了非常高的优先级,它能有效防止跨站脚本(XSS)攻击,这在我看来是它一个非常出彩且实用的特性。其核心机制在于&lt;strong&gt;默认的自动转义(auto-Escaping)&lt;/strong&gt;。&lt;/p&gt; &lt;p&gt;&lt;span&gt;立即学习&lt;/span&gt;“&lt;a href=&quot;https://pan.quark.cn/s/00968c3c2c15&quot; style=&quot;text-decoration: underline !important; color: blue; font-weight: bolder;&quot; rel=&quot;nofollow&quot; target=&quot;_blank&quot;&gt;go语言免费学习笔记(深入)&lt;/a&gt;”;&lt;/p&gt; &lt;p&gt;当你通过&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;html/template&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;渲染数据时,它并不仅仅是简单地将字符串替换到模板中。相反,它会根据数据在HTML文档中的上下文(例如,是在HTML元素内容中、属性值中、URL中还是JavaScript代码中)智能地选择合适的转义策略。&lt;/p&gt; &lt;p&gt;比如,当你在&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;{{.Message}}&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;这样直接输出到HTML内容的地方,&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;html/template&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;会自动将 &lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;<&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;, &lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;>&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;, &lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;&amp;&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;, &lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;’&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;, &lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;&quot;&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt; 这些HTML特殊字符转义成对应的HTML实体(如&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;&lt;&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;, &lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;&gt;&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;, &lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;&amp;&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;, &lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;’&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;, &lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;&quot;&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;)。这意味着,即使攻击者在&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;Message&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;字段中注入了&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;<script>alert(‘XSS’)</script>&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;这样的恶意代码,最终渲染到&lt;a style=&quot;color:#f60; text-decoration:underline;&quot; title=&quot;浏览器&quot; href=&quot;https://www.php.cn/zt/16180.html&quot; target=&quot;_blank&quot;&gt;浏览器&lt;/a&gt;中的也会是&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;&lt;script&gt;alert(‘XSS’)&lt;/script&gt;&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;,浏览器会将其视为普通文本显示,而不是执行JavaScript代码。&lt;/p&gt; &lt;p&gt;这种上下文感知转义机制非常强大,它不像一些其他模板引擎那样需要开发者手动调用转义函数,大大降低了开发者的负担和出错的可能性。当然,如果你确实需要输出未经转义的HTML内容(比如,你从一个可信源获取了一段HTML片段),&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;html/template&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;也提供了&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;template.HTML&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;、&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;template.CSS&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;、&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;template.JS&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;等类型。当你将字符串包装成这些类型时,模板引擎会认为你已经确认了内容的安全性,从而跳过转义。但说实话,这需要开发者非常谨慎,因为一旦滥用,就可能打开XSS的口子。我一般建议,除非你真的非常清楚自己在做什么,否则尽量让&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;html/template&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;自己去处理转义,这省心又安全。&lt;/p&gt; &lt;h3&gt;如何在Golang模板中处理循环和条件逻辑?&lt;/h3&gt; &lt;p&gt;在Golang的&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;html/template&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;中,处理循环和条件逻辑是非常直观和强大的,它提供了一套简洁的控制结构,让你可以根据数据动态地生成HTML内容。这在构建列表、表格或者根据某些条件显示不同内容时特别有用,我经常用它来处理数据集合。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;循环(&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;range&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;)&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;range&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;指令用于遍历数组、切片、映射或通道。它的语法与Go语言的&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;range&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;关键字类似,但又有些许不同。&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;遍历切片或数组:&lt;/strong&gt;&lt;/p&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=’brush:html;toolbar:false;’&gt;<ul> {{range .Items}} <li>{{.}}</li> {{end}} </ul>&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;在这个例子中,&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;.Items&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;是一个切片(比如&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;[]string{&quot;Go&quot;, &quot;HTML&quot;}&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;)。&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;{{range .Items}}&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;会遍历切片中的每个元素。在&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;{{range}}&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;和&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;{{end}}&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;之间,&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;{{.}}&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;代表当前迭代到的元素。&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;遍历映射:&lt;/strong&gt;&lt;/p&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=’brush:html;toolbar:false;’&gt;<dl> {{range $key, $value := .Config}} <dt>{{$key}}</dt> <dd>{{$value}}</dd> {{end}} </dl>&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;当遍历映射时,你可以用&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;$key, $value := .Config&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;来获取键和值。注意这里的&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;$key&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;和&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;$value&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;是模板变量,它们的作用域只在&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;range&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;块内部。&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;条件逻辑(&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;if&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt; &lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;else&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt; &lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;else if&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;)&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;if&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;指令用于根据布尔条件来显示或隐藏内容。在Go模板中,&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;nil&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;、&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;false&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;、零值(例如&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;0&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;、空字符串&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;&quot;&quot;&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;、空切片&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;[]&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;、空映射&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;map[]&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;)都会被视为假值。&lt;/p&gt; &lt;ul&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;简单的&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;if&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;:&lt;/strong&gt;&lt;/p&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=’brush:html;toolbar:false;’&gt;{{if .IsAdmin}} <p>欢迎,管理员!</p> {{end}}&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;如果&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;IsAdmin&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;字段为&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;true&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;,则显示“欢迎,管理员!”。&lt;/p&gt; &lt;div class=&quot;aritcle_card&quot;&gt; &lt;a class=&quot;aritcle_card_img&quot; href=&quot;/ai/airops&quot;&gt;&lt;img src=&quot;https://img.php.cn/upload/ai_manual/000/969/633/68b6da9aa121e531.png&quot; alt=&quot;AirOps&quot;&gt;&lt;/a&gt; &lt;div class=&quot;aritcle_card_info&quot;&gt; &lt;a href=&quot;/ai/airops&quot;&gt;AirOps&lt;/a&gt; &lt;p&gt;AirOps帮助业务团队使用正确的数据创建表、文档和工具&lt;/p&gt; &lt;div class=&quot;&quot;&gt; &lt;img src=&quot;/static/images/card_xiazai.png&quot; alt=&quot;AirOps&quot;&gt;&lt;span&gt;20&lt;/span&gt; &lt;/div&gt; &lt;/div&gt; &lt;a href=&quot;/ai/airops&quot; class=&quot;aritcle_card_btn&quot;&gt; &lt;span&gt;查看详情&lt;/span&gt; &lt;img src=&quot;/static/images/cardxiayige-3.png&quot; alt=&quot;AirOps&quot;&gt;&lt;/a&gt; &lt;/div&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;if-else&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;:&lt;/strong&gt;&lt;/p&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=’brush:html;toolbar:false;’&gt;{{if .HasMessage}} <p>您有新消息:{{.Message}}</p> {{else}} <p>您没有新消息。</p> {{end}}&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这会根据&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;HasMessage&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;的值显示不同的内容。&lt;/p&gt; &lt;/li&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;if-else if-else&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;:&lt;/strong&gt;&lt;/p&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=’brush:html;toolbar:false;’&gt;{{if eq .Status &quot;active&quot;}} <span class=&quot;badge badge-success&quot;>活跃</span> {{else if eq .Status &quot;pending&quot;}} <span class=&quot;badge badge-warning&quot;>待处理</span> {{else}} <span class=&quot;badge badge-danger&quot;>已禁用</span> {{end}}&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;这里使用了内置的&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;eq&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;(等于)函数来进行比较。&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;html/template&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;内置了一些这样的比较函数,比如&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;eq&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;、&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;ne&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;(不等于)、&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;lt&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;(小于)、&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;le&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;(小于等于)、&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;gt&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;(大于)、&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;ge&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;(大于等于)。在我看来,这些内置函数虽然不多,但已经足够覆盖大部分常见的逻辑判断场景了。&lt;/p&gt; &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;这些控制结构使得模板能够灵活地响应不同的数据状态,而无需在Go代码中手动拼接HTML字符串,大大提升了代码的可维护性和可读性。&lt;/p&gt; &lt;h3&gt;模板函数(Template Functions)在Golang渲染中的应用场景是什么?&lt;/h3&gt; &lt;p&gt;模板函数在Golang模板渲染中扮演着一个非常重要的角色,它允许你在模板内部执行更复杂的逻辑、数据转换或格式化操作,而不仅仅是简单地显示数据。我个人觉得,这是&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;html/template&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;在灵活性和表达力方面的一个关键扩展点,尤其是在需要对数据进行预处理或展示特定格式时。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;什么是模板函数?&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;简单来说,模板函数就是你用Go语言编写的普通函数,然后将其注册到&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;html/template&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;引擎中,这样你就可以在HTML模板里像调用内置函数一样调用它们。这些函数可以接收任意数量的参数(但通常是类型安全的),并返回一个或两个值(第二个值通常是错误)。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;主要应用场景:&lt;/strong&gt;&lt;/p&gt; &lt;ol&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;数据格式化:&lt;/strong&gt; 这是最常见的应用。例如,将日期时间对象格式化成用户友好的字符串(&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;&quot;2023年10月26日&quot;&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;),或者截断过长的文本,或者将数字格式化为货币形式。&lt;/p&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=’brush:go;toolbar:false;’&gt;// Go代码中定义一个日期格式化函数 func formatDate(t time.Time) string { return t.Format(&quot;2006-01-02 15:04:05&quot;) } // 注册到模板 var funcMap = template.FuncMap{ &quot;formatDate&quot;: formatDate, } tmpl := template.Must(template.New(&quot;index.html&quot;).Funcs(funcMap).ParseFiles(&quot;templates/index.html&quot;)) // 模板中使用 // <p>发布时间:{{.PublishTime | formatDate}}</p>&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt; &lt;li&gt; &lt;p&gt;&lt;strong&gt;字符串操作:&lt;/strong&gt; 比如将字符串转换为大写/小写,或者进行字符串拼接、替换等。&lt;/p&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=’brush:go;toolbar:false;’&gt;// Go代码 func toUpper(s string) string { return strings.ToUpper(s) } // 模板中使用 // <h1>{{.ProductTitle | toUpper}}</h1>&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/li&gt; &lt;li&gt;&lt;p&gt;&lt;strong&gt;简单计算或逻辑判断:&lt;/strong&gt; 虽然模板本身有&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;if&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;、&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;eq&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;等,但对于一些更复杂的数值计算或逻辑组合,通过模板函数来实现会更清晰。例如,计算两个数的和、判断一个用户是否属于某个角色组(如果这个逻辑不适合直接放在传递的数据中)。&lt;/p&gt;&lt;/li&gt; &lt;li&gt;&lt;p&gt;&lt;strong&gt;访问全局配置或辅助&lt;a style=&quot;color:#f60; text-decoration:underline;&quot; title=&quot;工具&quot; href=&quot;https://www.php.cn/zt/16887.html&quot; target=&quot;_blank&quot;&gt;工具&lt;/a&gt;:&lt;/strong&gt; 有时候,你可能需要从模板中访问一些不属于当前页面数据,但又是全局可用的信息,比如网站的名称、版本号,或者一个用来生成URL的辅助函数。通过模板函数,你可以封装这些逻辑。&lt;/p&gt;&lt;/li&gt; &lt;li&gt;&lt;p&gt;&lt;strong&gt;处理URL&lt;a style=&quot;color:#f60; text-decoration:underline;&quot; title=&quot;编码&quot; href=&quot;https://www.php.cn/zt/16108.html&quot; target=&quot;_blank&quot;&gt;编码&lt;/a&gt;:&lt;/strong&gt; 尽管&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;html/template&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;会自动处理URL中的转义,但如果你需要构建复杂的查询参数,或者对部分URL进行编码,模板函数可以提供更精细的控制。&lt;/p&gt;&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;&lt;strong&gt;如何使用?&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;首先,你需要创建一个&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;template.FuncMap&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;,将你的Go函数映射到一个在模板中使用的名字。&lt;/p&gt;&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=’brush:go;toolbar:false;’&gt;package main import ( &quot;html/template&quot; &quot;log&quot; &quot;net/http&quot; &quot;strings&quot; &quot;time&quot; ) // 定义一些自定义函数 func formatDate(t time.Time) string { return t.Format(&quot;2006年01月02日 15:04&quot;) } func greetUser(name string) string { return &quot;你好,&quot; + name + &quot;!&quot; } func main() { // 创建一个FuncMap,注册你的自定义函数 var funcMap = template.FuncMap{ &quot;formatDate&quot;: formatDate, &quot;greet&quot;: greetUser, &quot;toUpper&quot;: strings.ToUpper, // 也可以直接使用标准库的函数 } // 解析模板时,将FuncMap传递给New().Funcs() // 注意:Funcs()必须在ParseFiles()或ParseGlob()之前调用,否则函数不会被注册 tmpl, err := template.New(&quot;index.html&quot;).Funcs(funcMap).ParseFiles(&quot;templates/index.html&quot;) if err != nil { log.Fatalf(&quot;Error parsing template: %v&quot;, err) } http.HandleFunc(&quot;/&quot;, func(w http.ResponseWriter, r *http.Request) { data := struct { UserName string CurrentTime time.Time Product string }{ UserName: &quot;张三&quot;, CurrentTime: time.Now(), Product: &quot;Go语言编程&quot;, } err = tmpl.Execute(w, data) if err != nil { http.Error(w, &quot;Error executing template: &quot;+err.Error(), http.StatusInternalServerError) } }) log.Println(&quot;Server starting on :8080&quot;) log.Fatal(http.ListenAndServe(&quot;:8080&quot;, nil)) } /* // templates/index.html <!DOCTYPE html> <html lang=&quot;en&quot;> <head> <meta charset=&quot;UTF-8&quot;> <meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;> <title>模板函数示例</title> </head> <body> <h1>{{.UserName | greet}}</h1> <p>当前时间:{{.CurrentTime | formatDate}}</p> <p>产品名称(大写):{{.Product | toUpper}}</p> </body> </html> */&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;在模板中,你可以使用管道符&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;|&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;将数据传递给函数,就像&lt;div class=&quot;code&quot; style=&quot;position:relative; padding:0px; margin:0px;&quot;&gt;&lt;pre class=&quot;brush:php;toolbar:false;&quot;&gt;{{.CurrentTime | formatDate}}&lt;/pre&gt;&lt;div class=&quot;contentsignin&quot;&gt;&lt;/div&gt;&lt;/div&gt;这样。这让模板代码看起来非常简洁和函数式。我个人在处理一些需要跨多个模板使用的通用格式化逻辑时,特别喜欢用模板函数,它避免了在每个&lt;a style=&quot;color:#f60; text-decoration:underline;&quot; title=&quot;处理器&quot; href=&quot;https://www.php.cn/zt/16030.html&quot; target=&quot;_blank&quot;&gt;处理器&lt;/a&gt;函数中重复编写格式化代码,保持了代码的DRY(Don’t Repeat Yourself)原则。&lt;/p&gt;



评论(已关闭)

评论已关闭