gobyexample/public/text-templates

403 lines
22 KiB
Plaintext
Generated

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Go by Example: Text Templates</title>
<link rel=stylesheet href="site.css">
</head>
<script>
onkeydown = (e) => {
if (e.key == "ArrowLeft") {
window.location.href = 'regular-expressions';
}
if (e.key == "ArrowRight") {
window.location.href = 'json';
}
}
</script>
<body>
<div class="example" id="text-templates">
<h2><a href="./">Go by Example</a>: Text Templates</h2>
<table>
<tr>
<td class="docs">
<p>Go offers built-in support for creating
dynamic content or showing customized output to the user called Template.</p>
</td>
<td class="code empty leading">
</td>
</tr>
<tr>
<td class="docs">
</td>
<td class="code leading">
<a href="http://play.golang.org/p/-mRr-NuSB6f"><img title="Run code" src="play.png" class="run" /></a><img title="Copy code" src="clipboard.png" class="copy" />
<pre class="chroma"><span class="kn">package</span> <span class="nx">main</span>
</pre>
</td>
</tr>
<tr>
<td class="docs">
<p>Go has two template packages. one is &ldquo;text/template&rdquo; for
regular text manipulation, and another one is &ldquo;html/template&rdquo;
which has the same API as &ldquo;text/template&rdquo; but has additional security features.
It should be used when generating HTML.</p>
</td>
<td class="code leading">
<pre class="chroma">
<span class="kn">import</span> <span class="p">(</span>
<span class="s">&#34;log&#34;</span>
<span class="s">&#34;os&#34;</span>
<span class="s">&#34;text/template&#34;</span>
<span class="p">)</span>
</pre>
</td>
</tr>
<tr>
<td class="docs">
</td>
<td class="code leading">
<pre class="chroma"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</pre>
</td>
</tr>
<tr>
<td class="docs">
<p>New creates a template with a specific name and returns a pointer to it.</p>
</td>
<td class="code leading">
<pre class="chroma">
<span class="nx">t1</span> <span class="o">:=</span> <span class="nx">template</span><span class="p">.</span><span class="nf">New</span><span class="p">(</span><span class="s">&#34;t1&#34;</span><span class="p">)</span>
</pre>
</td>
</tr>
<tr>
<td class="docs">
<p>Parse parses its parameter as template body.
We use {{.}} to access the value passed to the template when it&rsquo;s getting executed.</p>
</td>
<td class="code leading">
<pre class="chroma">
<span class="nx">t1</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">t1</span><span class="p">.</span><span class="nf">Parse</span><span class="p">(</span><span class="s">&#34;Value is {{.}}\n&#34;</span><span class="p">)</span>
<span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</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="p">}</span>
</pre>
</td>
</tr>
<tr>
<td class="docs">
<p>If we want to ignore the errors we can use Must function.
It will panic if an error occurs when parsing the template.</p>
</td>
<td class="code leading">
<pre class="chroma">
<span class="nx">t1</span> <span class="p">=</span> <span class="nx">template</span><span class="p">.</span><span class="nf">Must</span><span class="p">(</span><span class="nx">t1</span><span class="p">.</span><span class="nf">Parse</span><span class="p">(</span><span class="s">&#34;Value is {{.}}\n&#34;</span><span class="p">))</span>
</pre>
</td>
</tr>
<tr>
<td class="docs">
<p>Execute applies parsed template to the data we pass to it and writes the output to the io.Writer.</p>
</td>
<td class="code leading">
<pre class="chroma">
<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="nx">t1</span><span class="p">.</span><span class="nf">Name</span><span class="p">())</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="s">&#34;some text&#34;</span><span class="p">)</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="kc">true</span><span class="p">)</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="mi">5</span><span class="p">)</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="p">[]</span><span class="kt">string</span><span class="p">{</span>
<span class="s">&#34;Go&#34;</span><span class="p">,</span>
<span class="s">&#34;Rust&#34;</span><span class="p">,</span>
<span class="s">&#34;C++&#34;</span><span class="p">,</span>
<span class="s">&#34;C#&#34;</span><span class="p">,</span>
<span class="p">})</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="kd">struct</span><span class="p">{</span> <span class="nx">name</span> <span class="kt">string</span> <span class="p">}{</span>
<span class="nx">name</span><span class="p">:</span> <span class="s">&#34;Jane Doe&#34;</span><span class="p">,</span>
<span class="p">})</span>
</pre>
</td>
</tr>
<tr>
<td class="docs">
<p>If the data is a struct we can use the {{.FieldName}} action to access its fields.
The fields should be exported to be accessible when template is executing.</p>
</td>
<td class="code leading">
<pre class="chroma">
<span class="nx">t2</span><span class="p">,</span> <span class="nx">_</span> <span class="o">:=</span> <span class="nx">template</span><span class="p">.</span>
<span class="nf">New</span><span class="p">(</span><span class="s">&#34;t2&#34;</span><span class="p">).</span>
<span class="nf">Parse</span><span class="p">(</span><span class="s">&#34;Fullname: {{.Fullname}}\n&#34;</span><span class="p">)</span>
</pre>
</td>
</tr>
<tr>
<td class="docs">
</td>
<td class="code leading">
<pre class="chroma"> <span class="nx">t2</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="kd">struct</span> <span class="p">{</span>
<span class="nx">Fullname</span> <span class="kt">string</span>
<span class="p">}{</span>
<span class="nx">Fullname</span><span class="p">:</span> <span class="s">&#34;Jane Doe&#34;</span><span class="p">,</span>
<span class="p">})</span>
</pre>
</td>
</tr>
<tr>
<td class="docs">
<p>The same applies to maps; with maps there is no restriction on the case of key names.</p>
</td>
<td class="code leading">
<pre class="chroma">
<span class="nx">t2</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="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;Fullname&#34;</span><span class="p">:</span> <span class="s">&#34;Mickey Mouse&#34;</span><span class="p">,</span>
<span class="p">})</span>
</pre>
</td>
</tr>
<tr>
<td class="docs">
<p>You can use if control structure to show data conditionally.
The data between if block will be shown if the field is truthy.
Means it is not false boolean, empty string, nil or zero length slice, nil map/pointer.</p>
</td>
<td class="code leading">
<pre class="chroma">
<span class="nx">t3</span><span class="p">,</span> <span class="nx">_</span> <span class="o">:=</span> <span class="nx">template</span><span class="p">.</span>
<span class="nf">New</span><span class="p">(</span><span class="s">&#34;t3&#34;</span><span class="p">).</span>
<span class="nf">Parse</span><span class="p">(</span><span class="s">`</span><span class="cp">{{</span><span class="k">if</span><span class="w"> </span><span class="na">.Field1</span><span class="cp">}}</span><span class="s">
</span><span class="s"> If block =&gt; </span><span class="cp">{{</span><span class="na">.Field1</span><span class="cp">}}</span><span class="s">
</span><span class="s"> </span><span class="cp">{{</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="na">.Field2</span><span class="cp">}}</span><span class="s">
</span><span class="s"> Else if block =&gt; </span><span class="cp">{{</span><span class="na">.Field2</span><span class="cp">}}</span><span class="s">
</span><span class="s"> </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="s"> Else block
</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 class="p">)</span>
</pre>
</td>
</tr>
<tr>
<td class="docs">
</td>
<td class="code leading">
<pre class="chroma"> <span class="nx">s</span> <span class="o">:=</span> <span class="kd">struct</span> <span class="p">{</span>
<span class="nx">Field1</span> <span class="kt">string</span>
<span class="nx">Field2</span> <span class="p">[]</span><span class="kt">string</span>
<span class="p">}{}</span>
</pre>
</td>
</tr>
<tr>
<td class="docs">
</td>
<td class="code leading">
<pre class="chroma"> <span class="nx">s</span><span class="p">.</span><span class="nx">Field1</span> <span class="p">=</span> <span class="s">&#34;&#34;</span>
<span class="nx">s</span><span class="p">.</span><span class="nx">Field2</span> <span class="p">=</span> <span class="p">[]</span><span class="kt">string</span><span class="p">{}</span>
<span class="nx">t3</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="nx">s</span><span class="p">)</span>
</pre>
</td>
</tr>
<tr>
<td class="docs">
</td>
<td class="code leading">
<pre class="chroma"> <span class="nx">s</span><span class="p">.</span><span class="nx">Field1</span> <span class="p">=</span> <span class="s">&#34;Some text&#34;</span>
<span class="nx">s</span><span class="p">.</span><span class="nx">Field2</span> <span class="p">=</span> <span class="kc">nil</span>
<span class="nx">t3</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="nx">s</span><span class="p">)</span>
</pre>
</td>
</tr>
<tr>
<td class="docs">
<p>Using a range action you can loop through a slice.
Each time the range block is getting executed dot will be set
to current item of slice.</p>
</td>
<td class="code leading">
<pre class="chroma">
<span class="nx">t4</span><span class="p">,</span> <span class="nx">_</span> <span class="o">:=</span> <span class="nx">template</span><span class="p">.</span>
<span class="nf">New</span><span class="p">(</span><span class="s">&#34;t4&#34;</span><span class="p">).</span>
<span class="nf">Parse</span><span class="p">(</span><span class="s">`Range: </span><span class="cp">{{</span><span class="w"> </span><span class="k">range</span><span class="w"> </span><span class="na">.</span><span class="w"> </span><span class="cp">}}</span><span class="s">
</span><span class="s"> </span><span class="cp">{{</span><span class="na">.</span><span class="cp">}}</span><span class="s">
</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 class="p">)</span>
<span class="nx">t4</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="p">[]</span><span class="kt">string</span><span class="p">{</span>
<span class="s">&#34;Go&#34;</span><span class="p">,</span>
<span class="s">&#34;Rust&#34;</span><span class="p">,</span>
<span class="s">&#34;C++&#34;</span><span class="p">,</span>
<span class="s">&#34;C#&#34;</span><span class="p">,</span>
<span class="p">})</span>
</pre>
</td>
</tr>
<tr>
<td class="docs">
<p>You can assign and reassign a value to a variable in templates.</p>
</td>
<td class="code">
<pre class="chroma">
<span class="nx">t5</span><span class="p">,</span> <span class="nx">_</span> <span class="o">:=</span> <span class="nx">template</span><span class="p">.</span>
<span class="nf">New</span><span class="p">(</span><span class="s">&#34;t5&#34;</span><span class="p">).</span>
<span class="nf">Parse</span><span class="p">(</span><span class="s">`Variables: </span><span class="cp">{{</span><span class="w"> </span><span class="nx">$language</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="s">&#34;go&#34;</span><span class="w"> </span><span class="cp">}}</span><span class="s">
</span><span class="s"> </span><span class="cp">{{</span><span class="w"> </span><span class="nx">$language</span><span class="w"> </span><span class="cp">}}</span><span class="s">
</span><span class="s"> </span><span class="cp">{{</span><span class="w"> </span><span class="nx">$language</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&#34;C&#34;</span><span class="w"> </span><span class="cp">}}</span><span class="s">
</span><span class="s"> </span><span class="cp">{{</span><span class="w"> </span><span class="nx">$language</span><span class="w"> </span><span class="cp">}}</span><span class="s">`</span><span class="p">)</span>
<span class="nx">t5</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="kc">nil</span><span class="p">)</span>
<span class="p">}</span>
</pre>
</td>
</tr>
</table>
<table>
<tr>
<td class="docs">
</td>
<td class="code leading">
<pre class="chroma"><span class="gp">$</span> go run templates.go
<span class="go">Value is my-template
</span><span class="go">Value is some text
</span><span class="go">Value is true
</span><span class="go">Value is 5
</span><span class="go">Value is [Go Rust C++ C#]
</span><span class="go">Value is {Jane Doe}
</span><span class="go">Fullname: Jane Doe
</span><span class="go">Fullname: Mickey Mouse</span></pre>
</td>
</tr>
<tr>
<td class="docs">
</td>
<td class="code leading">
<pre class="chroma"><span class="go"> Else block</span></pre>
</td>
</tr>
<tr>
<td class="docs">
</td>
<td class="code leading">
<pre class="chroma"><span class="go"> Else if block =&gt; Some text
</span><span class="go">Range:
</span><span class="go"> Go</span></pre>
</td>
</tr>
<tr>
<td class="docs">
</td>
<td class="code leading">
<pre class="chroma"><span class="go"> Rust</span></pre>
</td>
</tr>
<tr>
<td class="docs">
</td>
<td class="code leading">
<pre class="chroma"><span class="go"> C++</span></pre>
</td>
</tr>
<tr>
<td class="docs">
</td>
<td class="code">
<pre class="chroma"><span class="go"> C#
</span><span class="go">Variables:
</span><span class="go">go
</span><span class="go">C</span></pre>
</td>
</tr>
</table>
<p class="next">
Next example: <a href="json">JSON</a>.
</p>
<p class="footer">
by <a href="https://markmcgranaghan.com">Mark McGranaghan</a> and <a href="https://eli.thegreenplace.net">Eli Bendersky</a> | <a href="https://github.com/mmcgrana/gobyexample">source</a> | <a href="https://github.com/mmcgrana/gobyexample#license">license</a>
</p>
</div>
<script>
var codeLines = [];
codeLines.push('');codeLines.push('package main\u000A');codeLines.push('import (\u000A \"log\"\u000A \"os\"\u000A \"text/template\"\u000A)\u000A');codeLines.push('func main() {\u000A');codeLines.push(' t1 :\u003D template.New(\"t1\")\u000A');codeLines.push(' t1, err :\u003D t1.Parse(\"Value is {{.}}\\n\")\u000A if err !\u003D nil {\u000A log.Fatal(err)\u000A }\u000A');codeLines.push(' t1 \u003D template.Must(t1.Parse(\"Value is {{.}}\\n\"))\u000A');codeLines.push(' t1.Execute(os.Stdout, t1.Name())\u000A t1.Execute(os.Stdout, \"some text\")\u000A t1.Execute(os.Stdout, true)\u000A t1.Execute(os.Stdout, 5)\u000A t1.Execute(os.Stdout, []string{\u000A \"Go\",\u000A \"Rust\",\u000A \"C++\",\u000A \"C#\",\u000A })\u000A t1.Execute(os.Stdout, struct{ name string }{\u000A name: \"Jane Doe\",\u000A })\u000A');codeLines.push(' t2, _ :\u003D template.\u000A New(\"t2\").\u000A Parse(\"Fullname: {{.Fullname}}\\n\")\u000A');codeLines.push(' t2.Execute(os.Stdout, struct {\u000A Fullname string\u000A }{\u000A Fullname: \"Jane Doe\",\u000A })\u000A');codeLines.push(' t2.Execute(os.Stdout, map[string]string{\u000A \"Fullname\": \"Mickey Mouse\",\u000A })\u000A');codeLines.push(' t3, _ :\u003D template.\u000A New(\"t3\").\u000A Parse(`{{if .Field1}}\u000A If block \u003D\u003E {{.Field1}}\u000A {{ else if .Field2}}\u000A Else if block \u003D\u003E {{.Field2}}\u000A {{ else }}\u000A Else block\u000A {{ end }}`)\u000A');codeLines.push(' s :\u003D struct {\u000A Field1 string\u000A Field2 []string\u000A }{}\u000A');codeLines.push(' s.Field1 \u003D \"\"\u000A s.Field2 \u003D []string{}\u000A t3.Execute(os.Stdout, s)\u000A');codeLines.push(' s.Field1 \u003D \"Some text\"\u000A s.Field2 \u003D nil\u000A t3.Execute(os.Stdout, s)\u000A');codeLines.push(' t4, _ :\u003D template.\u000A New(\"t4\").\u000A Parse(`Range: {{ range . }}\u000A {{.}}\u000A {{ end }}`)\u000A t4.Execute(os.Stdout,\u000A []string{\u000A \"Go\",\u000A \"Rust\",\u000A \"C++\",\u000A \"C#\",\u000A })\u000A');codeLines.push(' t5, _ :\u003D template.\u000A New(\"t5\").\u000A Parse(`Variables: {{ $language :\u003D \"go\" }}\u000A {{ $language }}\u000A {{ $language \u003D \"C\" }}\u000A {{ $language }}`)\u000A t5.Execute(os.Stdout, nil)\u000A}\u000A');codeLines.push('');codeLines.push('');codeLines.push('');codeLines.push('');codeLines.push('');codeLines.push('');
</script>
<script src="site.js" async></script>
</body>
</html>