From ccfd710f2ba4f28593f86902af100fff629688ed Mon Sep 17 00:00:00 2001 From: Arash Sameni <74505991+ArashSameni@users.noreply.github.com> Date: Fri, 11 Feb 2022 00:16:38 +0330 Subject: [PATCH] Templates: added comments, output and listed in examples (#413) --- examples.txt | 1 + examples/text-templates/text-templates.go | 115 ++++++ examples/text-templates/text-templates.hash | 2 + examples/text-templates/text-templates.sh | 24 ++ public/index.html | 2 + public/json | 2 +- public/regular-expressions | 4 +- public/text-templates | 402 ++++++++++++++++++++ 8 files changed, 549 insertions(+), 3 deletions(-) create mode 100644 examples/text-templates/text-templates.go create mode 100644 examples/text-templates/text-templates.hash create mode 100644 examples/text-templates/text-templates.sh create mode 100644 public/text-templates diff --git a/examples.txt b/examples.txt index 961eea2..c0b7498 100644 --- a/examples.txt +++ b/examples.txt @@ -48,6 +48,7 @@ Collection Functions String Functions String Formatting Regular Expressions +Text Templates JSON XML Time diff --git a/examples/text-templates/text-templates.go b/examples/text-templates/text-templates.go new file mode 100644 index 0000000..cd0d9a0 --- /dev/null +++ b/examples/text-templates/text-templates.go @@ -0,0 +1,115 @@ +// 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" +// which has the same API as "text/template" but has additional security features. +// It should be used when generating HTML. +import ( + "log" + "os" + "text/template" +) + +func main() { + + // New creates a template with a specific name and returns a pointer to it. + t1 := template.New("t1") + + // Parse parses its parameter as template body. + // We use {{.}} to access the value passed to the template when it's getting executed. + t1, err := t1.Parse("Value is {{.}}\n") + if err != nil { + log.Fatal(err) + } + + // If we want to ignore the errors we can use Must function. + // It will panic if an error occurs when parsing the template. + t1 = template.Must(t1.Parse("Value is {{.}}\n")) + + // Execute applies parsed template to the data we pass to it and writes the output to the io.Writer. + t1.Execute(os.Stdout, t1.Name()) + t1.Execute(os.Stdout, "some text") + t1.Execute(os.Stdout, true) + t1.Execute(os.Stdout, 5) + t1.Execute(os.Stdout, []string{ + "Go", + "Rust", + "C++", + "C#", + }) + t1.Execute(os.Stdout, struct{ name string }{ + name: "Jane Doe", + }) + + // 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. + t2, _ := template. + New("t2"). + Parse("Fullname: {{.Fullname}}\n") + + t2.Execute(os.Stdout, struct { + Fullname string + }{ + Fullname: "Jane Doe", + }) + + // The same applies to maps; with maps there is no restriction on the case of key names. + t2.Execute(os.Stdout, map[string]string{ + "Fullname": "Mickey Mouse", + }) + + // 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. + t3, _ := template. + New("t3"). + Parse(`{{if .Field1}} + If block => {{.Field1}} + {{ else if .Field2}} + Else if block => {{.Field2}} + {{ else }} + Else block + {{ end }}`) + + s := struct { + Field1 string + Field2 []string + }{} + + s.Field1 = "" + s.Field2 = []string{} + t3.Execute(os.Stdout, s) + + s.Field1 = "Some text" + s.Field2 = nil + t3.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. + t4, _ := template. + New("t4"). + Parse(`Range: {{ range . }} + {{.}} + {{ end }}`) + t4.Execute(os.Stdout, + []string{ + "Go", + "Rust", + "C++", + "C#", + }) + + // You can assign and reassign a value to a variable in templates. + t5, _ := template. + New("t5"). + Parse(`Variables: + {{ $language := "go" }} + {{ $language }} + {{ $language = "C" }} + {{ $language }}`) + t5.Execute(os.Stdout, nil) +} diff --git a/examples/text-templates/text-templates.hash b/examples/text-templates/text-templates.hash new file mode 100644 index 0000000..d0418a6 --- /dev/null +++ b/examples/text-templates/text-templates.hash @@ -0,0 +1,2 @@ +69a28314f7ebd877b184b35a8166e2fcaab56754 +-mRr-NuSB6f diff --git a/examples/text-templates/text-templates.sh b/examples/text-templates/text-templates.sh new file mode 100644 index 0000000..3cf70b9 --- /dev/null +++ b/examples/text-templates/text-templates.sh @@ -0,0 +1,24 @@ +$ go run templates.go +Value is t1 +Value is some text +Value is true +Value is 5 +Value is [Go Rust C++ C#] +Value is {Jane Doe} +Fullname: Jane Doe +Fullname: Mickey Mouse + + Else block + + Else if block => Some text +Range: + Go + + Rust + + C++ + + C# +Variables: +go +C diff --git a/public/index.html b/public/index.html index 4ec3917..5dbce34 100644 --- a/public/index.html +++ b/public/index.html @@ -127,6 +127,8 @@
regexp
package docs
- Next example: JSON. + Next example: Text Templates.
diff --git a/public/text-templates b/public/text-templates new file mode 100644 index 0000000..1f03b49 --- /dev/null +++ b/public/text-templates @@ -0,0 +1,402 @@ + + + + ++ + | +
+
+ $ go run templates.go +Value is my-template +Value is some text +Value is true +Value is 5 +Value is [Go Rust C++ C#] +Value is {Jane Doe} +Fullname: Jane Doe +Fullname: Mickey Mouse+ |
+
+ + | +
+
+ Else block
+ |
+
+ + | +
+
+ Else if block => Some text +Range: + Go+ |
+
+ + | +
+
+ Rust
+ |
+
+ + | +
+
+ C++
+ |
+
+ + | +
+
+ C# +Variables: +go +C+ |
+
+ Next example: JSON. +
+ + + + +