<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Text/Template on 山高月小</title><link>https://blog.dart.xin/tags/text/template/</link><description>Recent content in Text/Template on 山高月小</description><generator>Hugo</generator><language>zh-cn</language><copyright>zwdart</copyright><lastBuildDate>Tue, 13 Oct 2026 11:32:20 +0800</lastBuildDate><atom:link href="https://blog.dart.xin/tags/text/template/index.xml" rel="self" type="application/rss+xml"/><item><title>Template text/template 完全学习</title><link>https://blog.dart.xin/golang/go108-text-template/</link><pubDate>Tue, 13 Oct 2026 11:32:20 +0800</pubDate><guid>https://blog.dart.xin/golang/go108-text-template/</guid><description>text/template 专门用于生成任意文本输出（HTML、配置文件、代码、Prompt 等）</description><content:encoded><![CDATA[<h1 id="go-语言-texttemplate-完全指南">Go 语言 <code>text/template</code> 完全指南</h1>
<p><code>text/template</code> 是 Go 标准库自带的模板引擎，专门用于生成<strong>任意文本输出</strong>（HTML、配置文件、代码、Prompt 等）。下面从零讲到进阶，每个知识点都配可运行代码。</p>
<hr>
<h2 id="一为什么需要模板引擎">一、为什么需要模板引擎？</h2>
<p>假设你要生成一段 Prompt：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="c1">// 字符串拼接</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">prompt</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="s">&#34;你是一个&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nx">role</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">&#34;助手。请用&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nx">style</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">&#34;风格回答。&#34;</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><p>一旦需求变复杂——要根据条件加 few-shot 示例、要循环生成示例、要做 A/B 实验——字符串拼接就变得难以维护。</p>
<p>模板引擎把&quot;文案&quot;和&quot;逻辑&quot;分离：</p>
<pre tabindex="0"><code>你是一个{{ .Role }}助手。请用{{ .Style }}风格回答。
</code></pre><p>代码只负责提供数据，模板负责渲染。</p>
<hr>
<h2 id="二最小可运行示例">二、最小可运行示例</h2>
<h3 id="maingo"><code>main.go</code></h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kn">package</span><span class="w"> </span><span class="nx">main</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="s">&#34;os&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="s">&#34;text/template&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">func</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="nx">tmpl</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">template</span><span class="p">.</span><span class="nf">Must</span><span class="p">(</span><span class="nx">template</span><span class="p">.</span><span class="nf">New</span><span class="p">(</span><span class="s">&#34;hello&#34;</span><span class="p">).</span><span class="nf">Parse</span><span class="p">(</span><span class="s">&#34;你好，{{ .Name }}！你今年 {{ .Age }} 岁。\n&#34;</span><span class="p">))</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="nx">data</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">any</span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="s">&#34;Name&#34;</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;小明&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="s">&#34;Age&#34;</span><span class="p">:</span><span class="w">  </span><span class="mi">18</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="k">if</span><span class="w"> </span><span class="nx">err</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">tmpl</span><span class="p">.</span><span class="nf">Execute</span><span class="p">(</span><span class="nx">os</span><span class="p">.</span><span class="nx">Stdout</span><span class="p">,</span><span class="w"> </span><span class="nx">data</span><span class="p">);</span><span class="w"> </span><span class="nx">err</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">nil</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><p>运行：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">go run main.go
</span></span></code></pre></td></tr></table>
</div>
</div><p>输出：</p>
<pre tabindex="0"><code>你好，小明！你今年 18 岁。
</code></pre><p>这就是模板的核心三步：<strong>Parse → Execute → 输出</strong>。</p>
<hr>
<h2 id="三三个核心概念">三、三个核心概念</h2>
<table>
	<thead>
			<tr>
					<th style="text-align: left">概念</th>
					<th style="text-align: left">说明</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td style="text-align: left"><strong>Template</strong></td>
					<td style="text-align: left">解析后的模板对象，可重复使用</td>
			</tr>
			<tr>
					<td style="text-align: left"><strong>Data</strong></td>
					<td style="text-align: left">传给模板的数据，可以是 map、struct、基本类型</td>
			</tr>
			<tr>
					<td style="text-align: left"><strong>Execute</strong></td>
					<td style="text-align: left">把模板与数据结合，写入 <code>io.Writer</code></td>
			</tr>
	</tbody>
</table>
<p>关键点：</p>
<ul>
<li><code>Parse</code> 只做一次，<code>Execute</code> 可以反复调用（并发安全）。</li>
<li><code>Execute</code> 的第二个参数就是模板里的 <code>.</code>（点）。</li>
</ul>
<hr>
<h2 id="四模板语法详解">四、模板语法详解</h2>
<h3 id="1-输出变量--字段-">1. 输出变量 <code>{{ .字段 }}</code></h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="nx">tmpl</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">template</span><span class="p">.</span><span class="nf">Must</span><span class="p">(</span><span class="nx">template</span><span class="p">.</span><span class="nf">New</span><span class="p">(</span><span class="s">&#34;x&#34;</span><span class="p">).</span><span class="nf">Parse</span><span class="p">(</span><span class="s">&#34;{{ .Name }} 在 {{ .City }}\n&#34;</span><span class="p">))</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">data</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span><span class="s">&#34;Name&#34;</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;小明&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;City&#34;</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;杭州&#34;</span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">tmpl</span><span class="p">.</span><span class="nf">Execute</span><span class="p">(</span><span class="nx">os</span><span class="p">.</span><span class="nx">Stdout</span><span class="p">,</span><span class="w"> </span><span class="nx">data</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// 输出：小明 在 杭州</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="2-struct-作为数据">2. struct 作为数据</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">type</span><span class="w"> </span><span class="nx">User</span><span class="w"> </span><span class="kd">struct</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="nx">Name</span><span class="w"> </span><span class="kt">string</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="nx">Age</span><span class="w">  </span><span class="kt">int</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">tmpl</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">template</span><span class="p">.</span><span class="nf">Must</span><span class="p">(</span><span class="nx">template</span><span class="p">.</span><span class="nf">New</span><span class="p">(</span><span class="s">&#34;x&#34;</span><span class="p">).</span><span class="nf">Parse</span><span class="p">(</span><span class="s">&#34;{{ .Name }} 今年 {{ .Age }} 岁\n&#34;</span><span class="p">))</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">tmpl</span><span class="p">.</span><span class="nf">Execute</span><span class="p">(</span><span class="nx">os</span><span class="p">.</span><span class="nx">Stdout</span><span class="p">,</span><span class="w"> </span><span class="nx">User</span><span class="p">{</span><span class="nx">Name</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;小明&#34;</span><span class="p">,</span><span class="w"> </span><span class="nx">Age</span><span class="p">:</span><span class="w"> </span><span class="mi">18</span><span class="p">})</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="c1">// 输出：小明 今年 18 岁</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p><strong>推荐用 struct</strong>：字段名写错会在编译期报错，比 map 更安全。</p>
</blockquote>
<h3 id="3-条件判断--if---else---end-">3. 条件判断 <code>{{ if }}</code> <code>{{ else }}</code> <code>{{ end }}</code></h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">const</span><span class="w"> </span><span class="nx">t</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="s">`</span><span class="cp">{{</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="na">.IsVIP</span><span class="w"> </span><span class="cp">}}</span><span class="s">尊贵的 VIP 用户</span><span class="cp">{{</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="cp">}}</span><span class="s">普通用户</span><span class="cp">{{</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="cp">}}</span><span class="s">，你好！
</span></span></span><span class="line"><span class="cl"><span class="s">`</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">tmpl</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">template</span><span class="p">.</span><span class="nf">Must</span><span class="p">(</span><span class="nx">template</span><span class="p">.</span><span class="nf">New</span><span class="p">(</span><span class="s">&#34;x&#34;</span><span class="p">).</span><span class="nf">Parse</span><span class="p">(</span><span class="nx">t</span><span class="p">))</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">tmpl</span><span class="p">.</span><span class="nf">Execute</span><span class="p">(</span><span class="nx">os</span><span class="p">.</span><span class="nx">Stdout</span><span class="p">,</span><span class="w"> </span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">bool</span><span class="p">{</span><span class="s">&#34;IsVIP&#34;</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">})</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">tmpl</span><span class="p">.</span><span class="nf">Execute</span><span class="p">(</span><span class="nx">os</span><span class="p">.</span><span class="nx">Stdout</span><span class="p">,</span><span class="w"> </span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">bool</span><span class="p">{</span><span class="s">&#34;IsVIP&#34;</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">})</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><p>输出：</p>
<pre tabindex="0"><code>尊贵的 VIP 用户，你好！
普通用户，你好！
</code></pre><p><code>if</code> 会判断值是否为&quot;零值&quot;：<code>false</code>、<code>0</code>、<code>&quot;&quot;</code>、<code>nil</code>、空切片都是假。</p>
<h3 id="4-循环--range-">4. 循环 <code>{{ range }}</code></h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">const</span><span class="w"> </span><span class="nx">t</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="s">`示例：
</span></span></span><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="k">range</span><span class="w"> </span><span class="na">.Examples</span><span class="w"> </span><span class="cp">}}</span><span class="s">输入：</span><span class="cp">{{</span><span class="w"> </span><span class="na">.Input</span><span class="w"> </span><span class="cp">}}</span><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="s">输出：</span><span class="cp">{{</span><span class="w"> </span><span class="na">.Output</span><span class="w"> </span><span class="cp">}}</span><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="cp">}}</span><span class="s">`</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">data</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">any</span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="s">&#34;Examples&#34;</span><span class="p">:</span><span class="w"> </span><span class="p">[]</span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="p">{</span><span class="s">&#34;Input&#34;</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;这家餐厅很棒&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;Output&#34;</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;正面&#34;</span><span class="p">},</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="p">{</span><span class="s">&#34;Input&#34;</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;太失望了&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;Output&#34;</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;负面&#34;</span><span class="p">},</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="p">{</span><span class="s">&#34;Input&#34;</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;今天天气不错&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;Output&#34;</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;中性&#34;</span><span class="p">},</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="p">},</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">tmpl</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">template</span><span class="p">.</span><span class="nf">Must</span><span class="p">(</span><span class="nx">template</span><span class="p">.</span><span class="nf">New</span><span class="p">(</span><span class="s">&#34;x&#34;</span><span class="p">).</span><span class="nf">Parse</span><span class="p">(</span><span class="nx">t</span><span class="p">))</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">tmpl</span><span class="p">.</span><span class="nf">Execute</span><span class="p">(</span><span class="nx">os</span><span class="p">.</span><span class="nx">Stdout</span><span class="p">,</span><span class="w"> </span><span class="nx">data</span><span class="p">)</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><p>输出：</p>
<pre tabindex="0"><code>示例：
输入：这家餐厅很棒
输出：正面
输入：太失望了
输出：负面
输入：今天天气不错
输出：中性
</code></pre><p><code>range</code> 里 <code>.</code> 变成当前元素，所以 <code>{{ .Input }}</code> 取当前元素的字段。</p>
<h3 id="5-循环里的索引">5. 循环里的索引</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">const</span><span class="w"> </span><span class="nx">t</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="s">`</span><span class="cp">{{</span><span class="w"> </span><span class="k">range</span><span class="w"> </span><span class="nx">$i</span><span class="o">,</span><span class="w"> </span><span class="nx">$v</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="na">.Items</span><span class="w"> </span><span class="cp">}}{{</span><span class="w"> </span><span class="nx">$i</span><span class="w"> </span><span class="cp">}}</span><span class="s">: </span><span class="cp">{{</span><span class="w"> </span><span class="nx">$v</span><span class="w"> </span><span class="cp">}}</span><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="cp">}}</span><span class="s">`</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">tmpl</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">template</span><span class="p">.</span><span class="nf">Must</span><span class="p">(</span><span class="nx">template</span><span class="p">.</span><span class="nf">New</span><span class="p">(</span><span class="s">&#34;x&#34;</span><span class="p">).</span><span class="nf">Parse</span><span class="p">(</span><span class="nx">t</span><span class="p">))</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">tmpl</span><span class="p">.</span><span class="nf">Execute</span><span class="p">(</span><span class="nx">os</span><span class="p">.</span><span class="nx">Stdout</span><span class="p">,</span><span class="w"> </span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">any</span><span class="p">{</span><span class="s">&#34;Items&#34;</span><span class="p">:</span><span class="w"> </span><span class="p">[]</span><span class="kt">string</span><span class="p">{</span><span class="s">&#34;a&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;b&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;c&#34;</span><span class="p">}})</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><p>输出：</p>
<pre tabindex="0"><code>0: a
1: b
2: c
</code></pre><h3 id="6-变量--x---">6. 变量 <code>{{ $x := ... }}</code></h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">const</span><span class="w"> </span><span class="nx">t</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="s">`</span><span class="cp">{{</span><span class="w"> </span><span class="nx">$name</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="na">.Name</span><span class="w"> </span><span class="cp">}}</span><span class="s">你好，</span><span class="cp">{{</span><span class="w"> </span><span class="nx">$name</span><span class="w"> </span><span class="cp">}}</span><span class="s">！</span><span class="cp">{{</span><span class="w"> </span><span class="nx">$name</span><span class="w"> </span><span class="cp">}}</span><span class="s">，欢迎回来。
</span></span></span><span class="line"><span class="cl"><span class="s">`</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">tmpl</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">template</span><span class="p">.</span><span class="nf">Must</span><span class="p">(</span><span class="nx">template</span><span class="p">.</span><span class="nf">New</span><span class="p">(</span><span class="s">&#34;x&#34;</span><span class="p">).</span><span class="nf">Parse</span><span class="p">(</span><span class="nx">t</span><span class="p">))</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">tmpl</span><span class="p">.</span><span class="nf">Execute</span><span class="p">(</span><span class="nx">os</span><span class="p">.</span><span class="nx">Stdout</span><span class="p">,</span><span class="w"> </span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span><span class="s">&#34;Name&#34;</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;小明&#34;</span><span class="p">})</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><p>输出：</p>
<pre tabindex="0"><code>你好，小明！小明，欢迎回来。
</code></pre><p>变量在 <code>{{ end }}</code> 后失效，也可以在 <code>range</code> 外定义、内部使用。</p>
<h3 id="7-管道----func-">7. 管道 <code>{{ . | func }}</code></h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">const</span><span class="w"> </span><span class="nx">t</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="s">`</span><span class="cp">{{</span><span class="w"> </span><span class="na">.Name</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="k">printf</span><span class="w"> </span><span class="s">&#34;%s先生&#34;</span><span class="w"> </span><span class="cp">}}{{</span><span class="w"> </span><span class="na">.Text</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="k">len</span><span class="w"> </span><span class="cp">}}</span><span class="s"> 个字
</span></span></span><span class="line"><span class="cl"><span class="s">`</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">tmpl</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">template</span><span class="p">.</span><span class="nf">Must</span><span class="p">(</span><span class="nx">template</span><span class="p">.</span><span class="nf">New</span><span class="p">(</span><span class="s">&#34;x&#34;</span><span class="p">).</span><span class="nf">Parse</span><span class="p">(</span><span class="nx">t</span><span class="p">))</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">tmpl</span><span class="p">.</span><span class="nf">Execute</span><span class="p">(</span><span class="nx">os</span><span class="p">.</span><span class="nx">Stdout</span><span class="p">,</span><span class="w"> </span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span><span class="s">&#34;Name&#34;</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;小明&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;Text&#34;</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;你好世界&#34;</span><span class="p">})</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><p>输出：</p>
<pre tabindex="0"><code>小明先生4 个字
</code></pre><p>管道把前一个结果作为后一个函数的最后一个参数。</p>
<h3 id="8-内建函数一览">8. 内建函数一览</h3>
<table>
	<thead>
			<tr>
					<th style="text-align: left">函数</th>
					<th style="text-align: left">作用</th>
					<th style="text-align: left">示例</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td style="text-align: left"><code>len</code></td>
					<td style="text-align: left">长度</td>
					<td style="text-align: left"><code>{{ .Text | len }}</code></td>
			</tr>
			<tr>
					<td style="text-align: left"><code>index</code></td>
					<td style="text-align: left">索引</td>
					<td style="text-align: left"><code>{{ index .Items 0 }}</code></td>
			</tr>
			<tr>
					<td style="text-align: left"><code>printf</code></td>
					<td style="text-align: left">格式化</td>
					<td style="text-align: left"><code>{{ printf &quot;%d&quot; .Age }}</code></td>
			</tr>
			<tr>
					<td style="text-align: left"><code>print</code> / <code>println</code></td>
					<td style="text-align: left">打印</td>
					<td style="text-align: left"><code>{{ print .Name }}</code></td>
			</tr>
			<tr>
					<td style="text-align: left"><code>eq</code> / <code>ne</code></td>
					<td style="text-align: left">等于/不等于</td>
					<td style="text-align: left"><code>{{ if eq .A .B }}</code></td>
			</tr>
			<tr>
					<td style="text-align: left"><code>lt</code> / <code>le</code> / <code>gt</code> / <code>ge</code></td>
					<td style="text-align: left">比较</td>
					<td style="text-align: left"><code>{{ if gt .Age 18 }}</code></td>
			</tr>
			<tr>
					<td style="text-align: left"><code>and</code> / <code>or</code> / <code>not</code></td>
					<td style="text-align: left">逻辑</td>
					<td style="text-align: left"><code>{{ if and .A .B }}</code></td>
			</tr>
			<tr>
					<td style="text-align: left"><code>urlquery</code></td>
					<td style="text-align: left">URL 转义</td>
					<td style="text-align: left"><code>{{ .Q | urlquery }}</code></td>
			</tr>
			<tr>
					<td style="text-align: left"><code>html</code></td>
					<td style="text-align: left">HTML 转义</td>
					<td style="text-align: left"><code>{{ .T | html }}</code></td>
			</tr>
			<tr>
					<td style="text-align: left"><code>js</code></td>
					<td style="text-align: left">JS 转义</td>
					<td style="text-align: left"><code>{{ .T | js }}</code></td>
			</tr>
	</tbody>
</table>
<h3 id="9-去除空白---和--">9. 去除空白 <code>{{-</code> 和 <code>-}}</code></h3>
<p>模板里的换行和缩进会原样输出。用 <code>-</code> 可以吃掉两侧空白：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">const</span><span class="w"> </span><span class="nx">t</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="s">`示例：
</span></span></span><span class="line"><span class="cl"><span class="cp">{{-</span><span class="w"> </span><span class="k">range</span><span class="w"> </span><span class="na">.Examples</span><span class="w"> </span><span class="cp">}}</span><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="s">输入：</span><span class="cp">{{</span><span class="w"> </span><span class="na">.Input</span><span class="w"> </span><span class="cp">}}</span><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="cp">{{-</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="cp">}}</span><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="s">`</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><p>输出会去掉 <code>range</code> 和 <code>end</code> 行产生的空行。</p>
<h3 id="10-注释---">10. 注释 <code>{{/* ... */}}</code></h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">const</span><span class="w"> </span><span class="nx">t</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="s">`</span><span class="cm">{{/* 这是注释，不会输出 */}}</span><span class="s">你好，</span><span class="cp">{{</span><span class="w"> </span><span class="na">.Name</span><span class="w"> </span><span class="cp">}}</span><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="s">`</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="五多模板与嵌套">五、多模板与嵌套</h2>
<h3 id="1-定义命名模板--define-">1. 定义命名模板 <code>{{ define }}</code></h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">const</span><span class="w"> </span><span class="nx">t</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="s">`
</span></span></span><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="k">define</span><span class="w"> </span><span class="s">&#34;greeting&#34;</span><span class="w"> </span><span class="cp">}}</span><span class="s">你好，</span><span class="cp">{{</span><span class="w"> </span><span class="na">.Name</span><span class="w"> </span><span class="cp">}}</span><span class="s">！</span><span class="cp">{{</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="cp">}}</span><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="k">define</span><span class="w"> </span><span class="s">&#34;body&#34;</span><span class="w"> </span><span class="cp">}}</span><span class="s">欢迎使用本系统。</span><span class="cp">{{</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="cp">}}</span><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="k">template</span><span class="w"> </span><span class="s">&#34;greeting&#34;</span><span class="w"> </span><span class="na">.</span><span class="w"> </span><span class="cp">}}</span><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="k">template</span><span class="w"> </span><span class="s">&#34;body&#34;</span><span class="w"> </span><span class="na">.</span><span class="w"> </span><span class="cp">}}</span><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="s">`</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">tmpl</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">template</span><span class="p">.</span><span class="nf">Must</span><span class="p">(</span><span class="nx">template</span><span class="p">.</span><span class="nf">New</span><span class="p">(</span><span class="s">&#34;x&#34;</span><span class="p">).</span><span class="nf">Parse</span><span class="p">(</span><span class="nx">t</span><span class="p">))</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">tmpl</span><span class="p">.</span><span class="nf">Execute</span><span class="p">(</span><span class="nx">os</span><span class="p">.</span><span class="nx">Stdout</span><span class="p">,</span><span class="w"> </span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span><span class="s">&#34;Name&#34;</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;小明&#34;</span><span class="p">})</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><p>输出：</p>
<pre tabindex="0"><code>你好，小明！
欢迎使用本系统。
</code></pre><h3 id="2-模板里调用模板">2. 模板里调用模板</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">const</span><span class="w"> </span><span class="nx">t</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="s">`
</span></span></span><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="k">define</span><span class="w"> </span><span class="s">&#34;example&#34;</span><span class="w"> </span><span class="cp">}}</span><span class="s">输入：</span><span class="cp">{{</span><span class="w"> </span><span class="na">.Input</span><span class="w"> </span><span class="cp">}}</span><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="s">输出：</span><span class="cp">{{</span><span class="w"> </span><span class="na">.Output</span><span class="w"> </span><span class="cp">}}</span><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="cp">}}</span><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="s">示例：
</span></span></span><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="k">range</span><span class="w"> </span><span class="na">.Examples</span><span class="w"> </span><span class="cp">}}{{</span><span class="w"> </span><span class="k">template</span><span class="w"> </span><span class="s">&#34;example&#34;</span><span class="w"> </span><span class="na">.</span><span class="w"> </span><span class="cp">}}{{</span><span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="cp">}}</span><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="s">`</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">data</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">any</span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="s">&#34;Examples&#34;</span><span class="p">:</span><span class="w"> </span><span class="p">[]</span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="p">{</span><span class="s">&#34;Input&#34;</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;很好&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;Output&#34;</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;正面&#34;</span><span class="p">},</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="p">{</span><span class="s">&#34;Input&#34;</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;太差&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;Output&#34;</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;负面&#34;</span><span class="p">},</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="p">},</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">tmpl</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">template</span><span class="p">.</span><span class="nf">Must</span><span class="p">(</span><span class="nx">template</span><span class="p">.</span><span class="nf">New</span><span class="p">(</span><span class="s">&#34;x&#34;</span><span class="p">).</span><span class="nf">Parse</span><span class="p">(</span><span class="nx">t</span><span class="p">))</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">tmpl</span><span class="p">.</span><span class="nf">Execute</span><span class="p">(</span><span class="nx">os</span><span class="p">.</span><span class="nx">Stdout</span><span class="p">,</span><span class="w"> </span><span class="nx">data</span><span class="p">)</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><p>输出：</p>
<pre tabindex="0"><code>示例：
输入：很好
输出：正面
输入：太差
输出：负面
</code></pre><hr>
<h2 id="六从文件加载模板">六、从文件加载模板</h2>
<p>真实项目里模板通常放在文件里。</p>
<h3 id="目录结构">目录结构</h3>
<pre tabindex="0"><code>.
├── main.go
└── tmpl/
    ├── greeting.tmpl
    └── example.tmpl
</code></pre><h3 id="tmplgreetingtmpl"><code>tmpl/greeting.tmpl</code></h3>
<pre tabindex="0"><code class="language-gotemplate" data-lang="gotemplate">你好，{{ .Name }}！欢迎使用。
</code></pre><h3 id="tmplexampletmpl"><code>tmpl/example.tmpl</code></h3>
<pre tabindex="0"><code class="language-gotemplate" data-lang="gotemplate">示例：
{{- range .Examples }}
输入：{{ .Input }}
输出：{{ .Output }}
{{- end }}
</code></pre><h3 id="maingo-1"><code>main.go</code></h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kn">package</span><span class="w"> </span><span class="nx">main</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="s">&#34;os&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="s">&#34;text/template&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">func</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="c1">// 加载单个文件</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="nx">t1</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">template</span><span class="p">.</span><span class="nf">Must</span><span class="p">(</span><span class="nx">template</span><span class="p">.</span><span class="nf">ParseFiles</span><span class="p">(</span><span class="s">&#34;tmpl/greeting.tmpl&#34;</span><span class="p">))</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="nx">t1</span><span class="p">.</span><span class="nf">Execute</span><span class="p">(</span><span class="nx">os</span><span class="p">.</span><span class="nx">Stdout</span><span class="p">,</span><span class="w"> </span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span><span class="s">&#34;Name&#34;</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;小明&#34;</span><span class="p">})</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="c1">// 加载多个文件</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="nx">t2</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">template</span><span class="p">.</span><span class="nf">Must</span><span class="p">(</span><span class="nx">template</span><span class="p">.</span><span class="nf">ParseGlob</span><span class="p">(</span><span class="s">&#34;tmpl/*.tmpl&#34;</span><span class="p">))</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="c1">// 指定用哪个模板渲染</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="nx">t2</span><span class="p">.</span><span class="nf">ExecuteTemplate</span><span class="p">(</span><span class="nx">os</span><span class="p">.</span><span class="nx">Stdout</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;example.tmpl&#34;</span><span class="p">,</span><span class="w"> </span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">any</span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="s">&#34;Examples&#34;</span><span class="p">:</span><span class="w"> </span><span class="p">[]</span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">			</span><span class="p">{</span><span class="s">&#34;Input&#34;</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;很好&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;Output&#34;</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;正面&#34;</span><span class="p">},</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">			</span><span class="p">{</span><span class="s">&#34;Input&#34;</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;太差&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;Output&#34;</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;负面&#34;</span><span class="p">},</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="p">},</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="p">})</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><p><strong>关键点</strong>：用 <code>ParseFiles</code> / <code>ParseGlob</code> 加载多文件时，模板名就是文件名。渲染时用 <code>ExecuteTemplate(w, &quot;文件名&quot;, data)</code> 指定用哪个。</p>
<hr>
<h2 id="七自定义函数">七、自定义函数</h2>
<p>模板可以注册自定义函数，扩展表达能力。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kn">package</span><span class="w"> </span><span class="nx">main</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="s">&#34;os&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="s">&#34;strings&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="s">&#34;text/template&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">func</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="nx">funcs</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">template</span><span class="p">.</span><span class="nx">FuncMap</span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="s">&#34;upper&#34;</span><span class="p">:</span><span class="w"> </span><span class="nx">strings</span><span class="p">.</span><span class="nx">ToUpper</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="s">&#34;trunc&#34;</span><span class="p">:</span><span class="w"> </span><span class="kd">func</span><span class="p">(</span><span class="nx">n</span><span class="w"> </span><span class="kt">int</span><span class="p">,</span><span class="w"> </span><span class="nx">s</span><span class="w"> </span><span class="kt">string</span><span class="p">)</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">			</span><span class="k">if</span><span class="w"> </span><span class="nb">len</span><span class="p">(</span><span class="nx">s</span><span class="p">)</span><span class="w"> </span><span class="o">&lt;=</span><span class="w"> </span><span class="nx">n</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">				</span><span class="k">return</span><span class="w"> </span><span class="nx">s</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">			</span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">			</span><span class="k">return</span><span class="w"> </span><span class="nx">s</span><span class="p">[:</span><span class="nx">n</span><span class="p">]</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s">&#34;...&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="p">},</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="s">&#34;add&#34;</span><span class="p">:</span><span class="w"> </span><span class="kd">func</span><span class="p">(</span><span class="nx">a</span><span class="p">,</span><span class="w"> </span><span class="nx">b</span><span class="w"> </span><span class="kt">int</span><span class="p">)</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nx">a</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nx">b</span><span class="w"> </span><span class="p">},</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="kd">const</span><span class="w"> </span><span class="nx">t</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="s">`</span><span class="cp">{{</span><span class="w"> </span><span class="na">.Name</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">upper</span><span class="w"> </span><span class="cp">}}</span><span class="s"> 
</span></span></span><span class="line"><span class="cl"><span class="cp">{{</span><span class="w"> </span><span class="na">.Text</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="nx">trunc</span><span class="w"> </span><span class="nx">10</span><span class="w"> </span><span class="cp">}}</span><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="s">1 + 2 = </span><span class="cp">{{</span><span class="w"> </span><span class="nx">add</span><span class="w"> </span><span class="nx">1</span><span class="w"> </span><span class="nx">2</span><span class="w"> </span><span class="cp">}}</span><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="s">`</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="nx">tmpl</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">template</span><span class="p">.</span><span class="nf">Must</span><span class="p">(</span><span class="nx">template</span><span class="p">.</span><span class="nf">New</span><span class="p">(</span><span class="s">&#34;x&#34;</span><span class="p">).</span><span class="nf">Funcs</span><span class="p">(</span><span class="nx">funcs</span><span class="p">).</span><span class="nf">Parse</span><span class="p">(</span><span class="nx">t</span><span class="p">))</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="nx">tmpl</span><span class="p">.</span><span class="nf">Execute</span><span class="p">(</span><span class="nx">os</span><span class="p">.</span><span class="nx">Stdout</span><span class="p">,</span><span class="w"> </span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="s">&#34;Name&#34;</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;xiaoming&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="s">&#34;Text&#34;</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;这是一段很长的文本内容需要截断&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="p">})</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><p>输出：</p>
<pre tabindex="0"><code>XIAOMING 
这是一段很长的文...
1 + 2 = 3
</code></pre><p><strong>注意</strong>：</p>
<ul>
<li>自定义函数必须在 <code>Parse</code> 之前用 <code>Funcs</code> 注册。</li>
<li>函数只能返回一个值或 <code>(值, error)</code>；返回 error 时，模板执行会中止并报错。</li>
<li>函数名是模板里用的名字，可以和 Go 函数名不同。</li>
</ul>
<hr>
<h2 id="八错误处理">八、错误处理</h2>
<p><code>Parse</code> 和 <code>Execute</code> 都可能出错，生产代码必须处理。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="nx">tmpl</span><span class="p">,</span><span class="w"> </span><span class="nx">err</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">template</span><span class="p">.</span><span class="nf">New</span><span class="p">(</span><span class="s">&#34;x&#34;</span><span class="p">).</span><span class="nf">Parse</span><span class="p">(</span><span class="s">&#34;{{ .NotExist }}&#34;</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">if</span><span class="w"> </span><span class="nx">err</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">nil</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="c1">// 解析错误：语法问题</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="nx">log</span><span class="p">.</span><span class="nf">Fatal</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nx">err</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nx">tmpl</span><span class="p">.</span><span class="nf">Execute</span><span class="p">(</span><span class="nx">os</span><span class="p">.</span><span class="nx">Stdout</span><span class="p">,</span><span class="w"> </span><span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span><span class="p">{</span><span class="s">&#34;Name&#34;</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;x&#34;</span><span class="p">})</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="k">if</span><span class="w"> </span><span class="nx">err</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">nil</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="c1">// 执行错误：字段不存在</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="nx">log</span><span class="p">.</span><span class="nf">Fatal</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><p>用 <code>template.Must</code> 可以在出错时直接 panic，适合初始化阶段：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="nx">tmpl</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">template</span><span class="p">.</span><span class="nf">Must</span><span class="p">(</span><span class="nx">template</span><span class="p">.</span><span class="nf">New</span><span class="p">(</span><span class="s">&#34;x&#34;</span><span class="p">).</span><span class="nf">Parse</span><span class="p">(</span><span class="s">&#34;...&#34;</span><span class="p">))</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><p><strong>规则</strong>：启动时加载模板用 <code>Must</code>，运行时 <code>Execute</code> 用 <code>if err != nil</code>。</p>
<hr>
<h2 id="九texttemplate-vs-htmltemplate">九、<code>text/template</code> vs <code>html/template</code></h2>
<table>
	<thead>
			<tr>
					<th style="text-align: left">维度</th>
					<th style="text-align: left"><code>text/template</code></th>
					<th style="text-align: left"><code>html/template</code></th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td style="text-align: left">用途</td>
					<td style="text-align: left">纯文本、代码、配置文件、Prompt</td>
					<td style="text-align: left">生成 HTML</td>
			</tr>
			<tr>
					<td style="text-align: left">输出转义</td>
					<td style="text-align: left">不转义</td>
					<td style="text-align: left">自动 HTML 转义</td>
			</tr>
			<tr>
					<td style="text-align: left">防 XSS</td>
					<td style="text-align: left">不负责</td>
					<td style="text-align: left">自动防 XSS</td>
			</tr>
			<tr>
					<td style="text-align: left">函数集</td>
					<td style="text-align: left">通用</td>
					<td style="text-align: left">增加 HTML 相关函数</td>
			</tr>
			<tr>
					<td style="text-align: left">用法</td>
					<td style="text-align: left">基本相同</td>
					<td style="text-align: left">基本相同</td>
			</tr>
	</tbody>
</table>
<p><strong>规则</strong>：</p>
<ul>
<li>生成 HTML → 用 <code>html/template</code></li>
<li>生成 Prompt、配置文件、代码 → 用 <code>text/template</code></li>
</ul>
<p>它们的模板语法完全一致，只是转义策略不同。</p>
<hr>
<h2 id="十完整可运行示例prompt-模板引擎">十、完整可运行示例：Prompt 模板引擎</h2>
<p>把上面所有知识点串起来，做一个 Prompt 工程里常见的例子。</p>
<h3 id="目录结构-1">目录结构</h3>
<pre tabindex="0"><code>.
├── main.go
├── config.json
└── prompts/
    └── classify.tmpl
</code></pre><h3 id="configjson"><code>config.json</code></h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;role&#34;</span><span class="p">:</span> <span class="s2">&#34;文本情感分类助手&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;labels&#34;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&#34;正面&#34;</span><span class="p">,</span> <span class="s2">&#34;负面&#34;</span><span class="p">,</span> <span class="s2">&#34;中性&#34;</span><span class="p">],</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;style&#34;</span><span class="p">:</span> <span class="s2">&#34;简洁&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">  <span class="nt">&#34;examples&#34;</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span><span class="nt">&#34;Input&#34;</span><span class="p">:</span> <span class="s2">&#34;这家餐厅很棒&#34;</span><span class="p">,</span> <span class="nt">&#34;Output&#34;</span><span class="p">:</span> <span class="s2">&#34;正面&#34;</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span><span class="nt">&#34;Input&#34;</span><span class="p">:</span> <span class="s2">&#34;太失望了&#34;</span><span class="p">,</span> <span class="nt">&#34;Output&#34;</span><span class="p">:</span> <span class="s2">&#34;负面&#34;</span><span class="p">},</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span><span class="nt">&#34;Input&#34;</span><span class="p">:</span> <span class="s2">&#34;今天天气不错&#34;</span><span class="p">,</span> <span class="nt">&#34;Output&#34;</span><span class="p">:</span> <span class="s2">&#34;中性&#34;</span><span class="p">}</span>
</span></span><span class="line"><span class="cl">  <span class="p">]</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="promptsclassifytmpl"><code>prompts/classify.tmpl</code></h3>
<pre tabindex="0"><code class="language-gotemplate" data-lang="gotemplate">你是一个{{ .Role }}。请对用户输入的文本进行分类。

{{- if .Labels }}
可选标签：{{ range $i, $l := .Labels }}{{ if $i }}、{{ end }}{{ $l }}{{ end }}
{{- end }}

风格要求：{{ .Style }}

{{- if .Examples }}
示例：
{{- range .Examples }}
输入：{{ .Input }}
输出：{{ .Output }}
{{- end }}
{{- end }}

输入：{{ .Input }}
输出：
</code></pre><h3 id="maingo-2"><code>main.go</code></h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span><span class="lnt">52
</span><span class="lnt">53
</span><span class="lnt">54
</span><span class="lnt">55
</span><span class="lnt">56
</span><span class="lnt">57
</span><span class="lnt">58
</span><span class="lnt">59
</span><span class="lnt">60
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kn">package</span><span class="w"> </span><span class="nx">main</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="s">&#34;encoding/json&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="s">&#34;fmt&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="s">&#34;os&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="s">&#34;strings&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="s">&#34;text/template&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">type</span><span class="w"> </span><span class="nx">Example</span><span class="w"> </span><span class="kd">struct</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="nx">Input</span><span class="w">  </span><span class="kt">string</span><span class="w"> </span><span class="s">`json:&#34;input&#34;`</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="nx">Output</span><span class="w"> </span><span class="kt">string</span><span class="w"> </span><span class="s">`json:&#34;output&#34;`</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">type</span><span class="w"> </span><span class="nx">Config</span><span class="w"> </span><span class="kd">struct</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="nx">Role</span><span class="w">     </span><span class="kt">string</span><span class="w">    </span><span class="s">`json:&#34;role&#34;`</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="nx">Labels</span><span class="w">   </span><span class="p">[]</span><span class="kt">string</span><span class="w">  </span><span class="s">`json:&#34;labels&#34;`</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="nx">Style</span><span class="w">    </span><span class="kt">string</span><span class="w">    </span><span class="s">`json:&#34;style&#34;`</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="nx">Examples</span><span class="w"> </span><span class="p">[]</span><span class="nx">Example</span><span class="w"> </span><span class="s">`json:&#34;examples&#34;`</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">type</span><span class="w"> </span><span class="nx">PromptData</span><span class="w"> </span><span class="kd">struct</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="nx">Role</span><span class="w">     </span><span class="kt">string</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="nx">Labels</span><span class="w">   </span><span class="p">[]</span><span class="kt">string</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="nx">Style</span><span class="w">    </span><span class="kt">string</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="nx">Examples</span><span class="w"> </span><span class="p">[]</span><span class="nx">Example</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="nx">Input</span><span class="w">    </span><span class="kt">string</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="kd">func</span><span class="w"> </span><span class="nf">main</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="c1">// 1. 读取配置</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="nx">cfgBytes</span><span class="p">,</span><span class="w"> </span><span class="nx">err</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">os</span><span class="p">.</span><span class="nf">ReadFile</span><span class="p">(</span><span class="s">&#34;config.json&#34;</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="k">if</span><span class="w"> </span><span class="nx">err</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">nil</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="kd">var</span><span class="w"> </span><span class="nx">cfg</span><span class="w"> </span><span class="nx">Config</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="k">if</span><span class="w"> </span><span class="nx">err</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">json</span><span class="p">.</span><span class="nf">Unmarshal</span><span class="p">(</span><span class="nx">cfgBytes</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="nx">cfg</span><span class="p">);</span><span class="w"> </span><span class="nx">err</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">nil</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="c1">// 2. 加载模板</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="nx">tmpl</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">template</span><span class="p">.</span><span class="nf">Must</span><span class="p">(</span><span class="nx">template</span><span class="p">.</span><span class="nf">ParseFiles</span><span class="p">(</span><span class="s">&#34;prompts/classify.tmpl&#34;</span><span class="p">))</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="c1">// 3. 渲染</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="nx">data</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">PromptData</span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="nx">Role</span><span class="p">:</span><span class="w">     </span><span class="nx">cfg</span><span class="p">.</span><span class="nx">Role</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="nx">Labels</span><span class="p">:</span><span class="w">   </span><span class="nx">cfg</span><span class="p">.</span><span class="nx">Labels</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="nx">Style</span><span class="p">:</span><span class="w">    </span><span class="nx">cfg</span><span class="p">.</span><span class="nx">Style</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="nx">Examples</span><span class="p">:</span><span class="w"> </span><span class="nx">cfg</span><span class="p">.</span><span class="nx">Examples</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="nx">Input</span><span class="p">:</span><span class="w">    </span><span class="s">&#34;Go 语言的并发模型非常优雅，我很喜欢。&#34;</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="kd">var</span><span class="w"> </span><span class="nx">sb</span><span class="w"> </span><span class="nx">strings</span><span class="p">.</span><span class="nx">Builder</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="k">if</span><span class="w"> </span><span class="nx">err</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nx">tmpl</span><span class="p">.</span><span class="nf">Execute</span><span class="p">(</span><span class="o">&amp;</span><span class="nx">sb</span><span class="p">,</span><span class="w"> </span><span class="nx">data</span><span class="p">);</span><span class="w"> </span><span class="nx">err</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">nil</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">		</span><span class="nb">panic</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="nx">sb</span><span class="p">.</span><span class="nf">String</span><span class="p">())</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="运行">运行</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">go run main.go
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="输出">输出</h3>
<pre tabindex="0"><code>你是一个文本情感分类助手。请对用户输入的文本进行分类。

可选标签：正面、负面、中性

风格要求：简洁

示例：
输入：这家餐厅很棒
输出：正面
输入：太失望了
输出：负面
输入：今天天气不错
输出：中性

输入：Go 语言的并发模型非常优雅，我很喜欢。
输出：
</code></pre><p>这个例子覆盖了：</p>
<ul>
<li>struct 作为数据</li>
<li><code>if</code> 条件</li>
<li><code>range</code> 循环</li>
<li>嵌套 <code>if</code> + <code>range</code></li>
<li><code>$i</code> 索引变量</li>
<li>空白控制 <code>{{-</code> / <code>-}}</code></li>
<li>从文件加载模板</li>
</ul>
<hr>
<h2 id="十一常见坑与最佳实践">十一、常见坑与最佳实践</h2>
<table>
	<thead>
			<tr>
					<th style="text-align: left">坑</th>
					<th style="text-align: left">说明</th>
					<th style="text-align: left">建议</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td style="text-align: left">字段不存在</td>
					<td style="text-align: left"><code>{{ .NotExist }}</code> 执行时报错</td>
					<td style="text-align: left">用 struct 而非 map，编译期发现拼写</td>
			</tr>
			<tr>
					<td style="text-align: left">空白太多</td>
					<td style="text-align: left">换行缩进原样输出</td>
					<td style="text-align: left">用 <code>{{-</code> 和 <code>-}}</code> 控制</td>
			</tr>
			<tr>
					<td style="text-align: left"><code>Parse</code> 只做一次</td>
					<td style="text-align: left">循环里重复 Parse 很浪费</td>
					<td style="text-align: left">Parse 一次，Execute 多次</td>
			</tr>
			<tr>
					<td style="text-align: left">并发安全</td>
					<td style="text-align: left"><code>Execute</code> 是并发安全的</td>
					<td style="text-align: left">一个 tmpl 可被多 goroutine 复用</td>
			</tr>
			<tr>
					<td style="text-align: left">自定义函数顺序</td>
					<td style="text-align: left">必须 Parse 前注册</td>
					<td style="text-align: left"><code>New().Funcs(...).Parse(...)</code></td>
			</tr>
			<tr>
					<td style="text-align: left">HTML 场景误用</td>
					<td style="text-align: left"><code>text/template</code> 不防 XSS</td>
					<td style="text-align: left">HTML 输出改用 <code>html/template</code></td>
			</tr>
			<tr>
					<td style="text-align: left">模板名混淆</td>
					<td style="text-align: left"><code>ParseFiles</code> 时模板名=文件名</td>
					<td style="text-align: left">用 <code>ExecuteTemplate</code> 指定</td>
			</tr>
	</tbody>
</table>
<hr>
<h2 id="十二函数速查表">十二、函数速查表</h2>
<table>
	<thead>
			<tr>
					<th style="text-align: left">函数</th>
					<th style="text-align: left">说明</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td style="text-align: left"><code>and</code> <code>or</code> <code>not</code></td>
					<td style="text-align: left">逻辑运算</td>
			</tr>
			<tr>
					<td style="text-align: left"><code>eq</code> <code>ne</code> <code>lt</code> <code>le</code> <code>gt</code> <code>ge</code></td>
					<td style="text-align: left">比较</td>
			</tr>
			<tr>
					<td style="text-align: left"><code>len</code></td>
					<td style="text-align: left">长度</td>
			</tr>
			<tr>
					<td style="text-align: left"><code>index</code></td>
					<td style="text-align: left">索引</td>
			</tr>
			<tr>
					<td style="text-align: left"><code>slice</code></td>
					<td style="text-align: left">切片</td>
			</tr>
			<tr>
					<td style="text-align: left"><code>print</code> <code>printf</code> <code>println</code></td>
					<td style="text-align: left">格式化</td>
			</tr>
			<tr>
					<td style="text-align: left"><code>urlquery</code></td>
					<td style="text-align: left">URL 查询转义</td>
			</tr>
			<tr>
					<td style="text-align: left"><code>html</code> <code>js</code> <code>urlquery</code></td>
					<td style="text-align: left">转义</td>
			</tr>
			<tr>
					<td style="text-align: left"><code>call</code></td>
					<td style="text-align: left">调用函数值</td>
			</tr>
	</tbody>
</table>
<hr>
<h2 id="十三一句话总结">十三、一句话总结</h2>
<blockquote>
<p><strong><code>text/template</code> 用 <code>Parse</code> 解析模板、<code>Execute</code> 渲染数据，支持变量、条件、循环、管道、嵌套、自定义函数，把&quot;文案&quot;与&quot;逻辑&quot;分离。它语法简单、标准库自带、无依赖，是 Go 生成任意文本（包括 Prompt）的首选。</strong></p>
</blockquote>
<p>上面的完整示例可以直接 <code>go run</code>，覆盖了日常使用 90% 的场景。需要更复杂的场景（如热加载、多模板继承）时，再叠加 <code>ParseGlob</code> 和 <code>define</code> / <code>template</code> 即可。</p>
]]></content:encoded></item></channel></rss>