Imagine you’re working on a web application and need to return HTML that lists most recent tweets. You need to load list of tweets from a database and create HTML based on that information.
Building that HTML string by building smaller strings and concatenating them with +
would be tedious.
Packages text/template
and html/template
in Go standard library make implement data-driven templates for generating textual output:
https://codeeval.dev/gist/268012d588ff9c1b80fdca03bc5cf0b8
Each template has a name. template.New("tweets")
creates an empty template with name tweets
.
t.Parse(s string)
parses the template.
t.Execute(w io.Writer, v interface{})
executes the template with a given value and writing the result to an io.Writer
.
{{ ... }}
is an action are instructions for templating engine.
{{.TweetCount}}
means printing the value of TweetCount
in current context.
Data passed to a template can be hierarchical (i.e. a struct withing a struct within a struct…).
Current context .
refers to current scope within the data.
Initial .
refers to top-level scope:
https://codeeval.dev/gist/9184283766765fd094cabdc53491402a
Values that don’t have pre-defined formatting are printed using Stringer
interface. For custom formatting of your type in a template implement String() string
method.
{{range .Tweets}}{{end}}
evaluates inner part for every element of []string
slice Tweets
and sets current context .
within the inner part to elements of Tweets
slice.
{{index .RecentTweets 0}}
is equivalent to RecentTweets[0]
in Go code.
Text in a template is copied verbatim. Having to preserve whitespace can lead to ugly templates.
To help write more readable templates We can add -
at the beginning or end of action as seen in {{end -}}
.
This remove whitespace before or after the action.
{{range .RecentTweets}}
changes variable scope and we don’t have access to data outside. If we need to access data from upper scope, we can define variables like {{ $tweetCount := len .RecentTweets }}
.