Templating in Go
GoDFW Lightning Talks - 6/21/16
Stephen Rudolph
Text Templating
import "text/template"
Merging Text + Data
const (
letter = `Dear {{.}}, How are you?`
)
tmpl, err := template.New("letter").Parse(letter)
tmpl.Execute(os.Stdout, "Professor Jones")
Merging Text + Data
const (
letter = `Dear {{.}}, How are you?`
)
tmpl, err := template.New("letter").Parse(letter)
tmpl.Execute(os.Stdout, "Professor Jones")
Dear Professor Jones, How are you?
Text + Data Collections
const (
letter = `Dear {{range .}}{{.}}, {{end}} How are you?`
)
tmpl, err := template.New("letter").Parse(letter)
tmpl.Execute(os.Stdout, []string{"Harry", "Jane", "Lisa", "George"})
Text + Data Collections
const (
letter = `Dear {{range .}}{{.}}, {{end}} How are you?`
)
tmpl, err := template.New("letter").Parse(letter)
tmpl.Execute(os.Stdout, []string{"Harry", "Jane", "Lisa", "George"})
Dear Harry, Jane, Lisa, George, How are you?
Text + Data + Logic
var funcMap = template.FuncMap{
"increment": increment,
}
func increment(x int) int {
return x + 1
}
const (
letter = `Dear {{with $names := .}}
{{- range $i, $val := $names}}
{{- if lt (increment $i) (len $names)}}
{{- $val}}, {{else -}} and {{$val}}{{end}}
{{- end}}{{end}}; How are you?`
)
tmpl, err := template.New("letter").Funcs(funcMap).Parse(letter)
tmpl.Execute(os.Stdout, []string{"Harry", "Jane", "Lisa", "George"})
Text + Data + Logic
var funcMap = template.FuncMap{
"increment": increment,
}
func increment(x int) int {
return x + 1
}
const (
letter = `Dear {{with $names := .}}
{{- range $i, $val := $names}}
{{- if lt (increment $i) (len $names)}}
{{- $val}}, {{else -}} and {{$val}}{{end}}
{{- end}}{{end}}; How are you?`
)
tmpl, err := template.New("letter").Funcs(funcMap).Parse(letter)
tmpl.Execute(os.Stdout, []string{"Harry", "Jane", "Lisa", "George"})
Dear Harry, Jane, Lisa, and George; How are you?
Text + Data Structuresconst (
letter = `------------------------------
{{range .}}{{.FirstName}} {{.LastName}}
{{.Street}}
{{.City}}, {{.State}} {{.Zip}}
Dear {{.FirstName}},
How are you?
------------------------------
{{end}}`
)
tmpl, err := template.New("letter").Parse(letter)
harry := Person{
FirstName: "Harry",
LastName: "Jones",
Street: "1234 Main St.",
City: "Springfield",
State: "IL",
Zip: "12345-6789",
}
tmpl.Execute(os.Stdout, []Person{harry, jane})
Text + Data Structuresconst (
letter = `------------------------------
{{range .}}{{.FirstName}} {{.LastName}}
{{.Street}}
{{.City}}, {{.State}} {{.Zip}}
Dear {{.FirstName}},
How are you?
------------------------------
{{end}}`
)
tmpl, err := template.New("letter").Parse(letter)
harry := Person{
FirstName: "Harry",
LastName: "Jones",
Street: "1234 Main St.",
City: "Springfield",
State: "IL",
Zip: "12345-6789",
}
tmpl.Execute(os.Stdout, []Person{harry, jane})
------------------------------
Harry Jones
1234 Main St.
Springfield, IL 12345-6789
Dear Harry,
How are you?
------------------------------
Jane Sherman
8511 1st Ave.
Dayton, OH 18515-6261
Dear Jane,
How are you?
------------------------------
HTML Templating
import "html/template"
HTML + Data Structuresconst (
letter = `<html><body><table>
<tr><th></th><th>Name</th><th>Address</th></tr>
{{range .}}
<tr>
<td><img src="{{.AvatarUrl}}"></td>
<td>{{.FirstName}} {{.LastName}}</td>
<td>{{.Street}}, {{.City}}, {{.State}} {{.Zip}}</td>
</tr>
{{end}}
</table></body></html>`
)
tmpl, err := template.New("letter").Parse(letter)
tmpl.Execute(os.Stdout, []Person{harry, jane})
HTML + Data Structuresconst (
letter = `<html><body><table>
<tr><th></th><th>Name</th><th>Address</th></tr>
{{range .}}
<tr>
<td><img src="{{.AvatarUrl}}"></td>
<td>{{.FirstName}} {{.LastName}}</td>
<td>{{.Street}}, {{.City}}, {{.State}} {{.Zip}}</td>
</tr>
{{end}}
</table></body></html>`
)
tmpl, err := template.New("letter").Parse(letter)
tmpl.Execute(os.Stdout, []Person{harry, jane})
HTML + Malicious Data
harry := Person{
FirstName: `Harry<script>alert("You've been hacked!")</script>`,
LastName: "Jones",
Street: "1234 Main St.",
City: "Springfield",
State: "IL",
Zip: "12345-6789",
AvatarUrl: "harry.png",
}
HTML + Malicious Data
harry := Person{
FirstName: `Harry<script>alert("You've been hacked!")</script>`,
LastName: "Jones",
Street: "1234 Main St.",
City: "Springfield",
State: "IL",
Zip: "12345-6789",
AvatarUrl: "harry.png",
}
Text + Malicious Data
harry := Person{
FirstName: `Harry<script>alert("You've been hacked!")</script>`,
LastName: "Jones",
Street: "1234 Main St.",
City: "Springfield",
State: "IL",
Zip: "12345-6789",
AvatarUrl: "harry.png",
}

Templating in Go

  • 1.
    Templating in Go GoDFWLightning Talks - 6/21/16 Stephen Rudolph
  • 2.
  • 3.
    Merging Text +Data const ( letter = `Dear {{.}}, How are you?` ) tmpl, err := template.New("letter").Parse(letter) tmpl.Execute(os.Stdout, "Professor Jones")
  • 4.
    Merging Text +Data const ( letter = `Dear {{.}}, How are you?` ) tmpl, err := template.New("letter").Parse(letter) tmpl.Execute(os.Stdout, "Professor Jones") Dear Professor Jones, How are you?
  • 5.
    Text + DataCollections const ( letter = `Dear {{range .}}{{.}}, {{end}} How are you?` ) tmpl, err := template.New("letter").Parse(letter) tmpl.Execute(os.Stdout, []string{"Harry", "Jane", "Lisa", "George"})
  • 6.
    Text + DataCollections const ( letter = `Dear {{range .}}{{.}}, {{end}} How are you?` ) tmpl, err := template.New("letter").Parse(letter) tmpl.Execute(os.Stdout, []string{"Harry", "Jane", "Lisa", "George"}) Dear Harry, Jane, Lisa, George, How are you?
  • 7.
    Text + Data+ Logic var funcMap = template.FuncMap{ "increment": increment, } func increment(x int) int { return x + 1 } const ( letter = `Dear {{with $names := .}} {{- range $i, $val := $names}} {{- if lt (increment $i) (len $names)}} {{- $val}}, {{else -}} and {{$val}}{{end}} {{- end}}{{end}}; How are you?` ) tmpl, err := template.New("letter").Funcs(funcMap).Parse(letter) tmpl.Execute(os.Stdout, []string{"Harry", "Jane", "Lisa", "George"})
  • 8.
    Text + Data+ Logic var funcMap = template.FuncMap{ "increment": increment, } func increment(x int) int { return x + 1 } const ( letter = `Dear {{with $names := .}} {{- range $i, $val := $names}} {{- if lt (increment $i) (len $names)}} {{- $val}}, {{else -}} and {{$val}}{{end}} {{- end}}{{end}}; How are you?` ) tmpl, err := template.New("letter").Funcs(funcMap).Parse(letter) tmpl.Execute(os.Stdout, []string{"Harry", "Jane", "Lisa", "George"}) Dear Harry, Jane, Lisa, and George; How are you?
  • 9.
    Text + DataStructuresconst ( letter = `------------------------------ {{range .}}{{.FirstName}} {{.LastName}} {{.Street}} {{.City}}, {{.State}} {{.Zip}} Dear {{.FirstName}}, How are you? ------------------------------ {{end}}` ) tmpl, err := template.New("letter").Parse(letter) harry := Person{ FirstName: "Harry", LastName: "Jones", Street: "1234 Main St.", City: "Springfield", State: "IL", Zip: "12345-6789", } tmpl.Execute(os.Stdout, []Person{harry, jane})
  • 10.
    Text + DataStructuresconst ( letter = `------------------------------ {{range .}}{{.FirstName}} {{.LastName}} {{.Street}} {{.City}}, {{.State}} {{.Zip}} Dear {{.FirstName}}, How are you? ------------------------------ {{end}}` ) tmpl, err := template.New("letter").Parse(letter) harry := Person{ FirstName: "Harry", LastName: "Jones", Street: "1234 Main St.", City: "Springfield", State: "IL", Zip: "12345-6789", } tmpl.Execute(os.Stdout, []Person{harry, jane}) ------------------------------ Harry Jones 1234 Main St. Springfield, IL 12345-6789 Dear Harry, How are you? ------------------------------ Jane Sherman 8511 1st Ave. Dayton, OH 18515-6261 Dear Jane, How are you? ------------------------------
  • 11.
  • 12.
    HTML + DataStructuresconst ( letter = `<html><body><table> <tr><th></th><th>Name</th><th>Address</th></tr> {{range .}} <tr> <td><img src="{{.AvatarUrl}}"></td> <td>{{.FirstName}} {{.LastName}}</td> <td>{{.Street}}, {{.City}}, {{.State}} {{.Zip}}</td> </tr> {{end}} </table></body></html>` ) tmpl, err := template.New("letter").Parse(letter) tmpl.Execute(os.Stdout, []Person{harry, jane})
  • 13.
    HTML + DataStructuresconst ( letter = `<html><body><table> <tr><th></th><th>Name</th><th>Address</th></tr> {{range .}} <tr> <td><img src="{{.AvatarUrl}}"></td> <td>{{.FirstName}} {{.LastName}}</td> <td>{{.Street}}, {{.City}}, {{.State}} {{.Zip}}</td> </tr> {{end}} </table></body></html>` ) tmpl, err := template.New("letter").Parse(letter) tmpl.Execute(os.Stdout, []Person{harry, jane})
  • 14.
    HTML + MaliciousData harry := Person{ FirstName: `Harry<script>alert("You've been hacked!")</script>`, LastName: "Jones", Street: "1234 Main St.", City: "Springfield", State: "IL", Zip: "12345-6789", AvatarUrl: "harry.png", }
  • 15.
    HTML + MaliciousData harry := Person{ FirstName: `Harry<script>alert("You've been hacked!")</script>`, LastName: "Jones", Street: "1234 Main St.", City: "Springfield", State: "IL", Zip: "12345-6789", AvatarUrl: "harry.png", }
  • 16.
    Text + MaliciousData harry := Person{ FirstName: `Harry<script>alert("You've been hacked!")</script>`, LastName: "Jones", Street: "1234 Main St.", City: "Springfield", State: "IL", Zip: "12345-6789", AvatarUrl: "harry.png", }