-
-
-
- Go offers built-in support for creating
-dynamic content or showing customized output to the user called Template.
-
- |
-
-
-
- |
-
-
-
-
-
- |
-
- 
- package main
-
- |
-
-
-
-
- Go has two template packages. one is “text/template” for
-regular text manipulation, and another one is “html/template”.
-“html/template” has the same API as text/template which has additional security features.
-It should be used when generating HTML
-Here we show some of “text/template” features.
-
- |
-
-
-
-import (
- "os"
- "text/template"
-)
-
- |
-
-
-
-
-
- |
-
-
- func main() {
-
- |
-
-
-
-
- New creates a template with a specific name and returns a pointer to it.
-
- |
-
-
-
- t := template.New("my-template")
-
- |
-
-
-
-
- Parse parses its parameter as template body.
-We use {{.}} to access the value passed to the template when it’s getting executed.
-
- |
-
-
-
- t, _ = t.Parse("Value is {{.}}\n")
-
- |
-
-
-
-
- If we want to ignore the errors we can use Must function.
-It will panic if an error occurs when parsing the template.
-
- |
-
-
-
- t = template.Must(t.Parse("Value is {{.}}\n"))
-
- |
-
-
-
-
- Execute applies parsed template to the data we pass to it and writes the output to the io.Writer.
-
- |
-
-
-
- t.Execute(os.Stdout, t.Name())
- t.Execute(os.Stdout, "some text")
- t.Execute(os.Stdout, true)
- t.Execute(os.Stdout, 5)
- t.Execute(os.Stdout, []string{
- "Go",
- "Rust",
- "C++",
- "C#",
- })
- t.Execute(os.Stdout, struct{ name string }{
- name: "Arash",
- })
-
- |
-
-
-
-
- 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.
-
- |
-
-
-
- t, _ = t.Parse("Firstname: {{.Firstname}}" +
- ", Lastname: {{.Lastname}}\n")
-
- |
-
-
-
-
-
- |
-
-
- t.Execute(os.Stdout, struct {
- Firstname, Lastname string
- }{
- Firstname: "Arash",
- Lastname: "Sameni",
- })
-
- |
-
-
-
-
- Samething applies for maps. But it’s not necessary to have uppercase fields.
-
- |
-
-
-
- t.Execute(os.Stdout, map[string]string{
- "Firstname": "Robert",
- "Lastname": "Griesemer",
- })
-
- |
-
-
-
-
- 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.
-
- |
-
-
-
- t, _ = t.Parse(`{{if .Field1}}
- If block => {{.Field1}}
- {{ else if .Field2}}
- Else if block => {{.Field2}}
- {{ else }}
- Else block
- {{ end }}`)
-
- |
-
-
-
-
-
- |
-
-
- s := struct {
- Field1, Field2 interface{}
- }{}
-
- |
-
-
-
-
-
- |
-
-
- s.Field1 = ""
- s.Field2 = []string{}
- t.Execute(os.Stdout, s)
-
- |
-
-
-
-
-
- |
-
-
- s.Field1 = nil
- s.Field2 = "Some text"
- t.Execute(os.Stdout, s)
-
- |
-
-
-
-
- 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.
-You can use $ in blocks to access outside data.
-
- |
-
-
-
- t, _ = t.Parse(`Range: {{ range . }}
- {{.}}
- {{ end }}`)
- t.Execute(os.Stdout, []string{
- "Go",
- "Rust",
- "C++",
- "C#",
- })
-
- |
-
-
-
-
- You can assign and reassign a value to a variable in templates.
-
- |
-
-
-
- t, _ = t.Parse(`Variables: {{ $language := "go" }}
- {{ $language }}
- {{ $language = "C" }}
- {{ $language }}`)
- t.Execute(os.Stdout, nil)
-}
-
- |
-
-
-