Skip to content

Instantly share code, notes, and snippets.

@gsw945
Last active September 5, 2023 10:10
Show Gist options
  • Save gsw945/c74340bd9ff8236044b77f284e914ed5 to your computer and use it in GitHub Desktop.
Save gsw945/c74340bd9ff8236044b77f284e914ed5 to your computer and use it in GitHub Desktop.
Go text/template multiple templates demo
package main
import (
"fmt"
"html/template"
"os"
)
func main() {
const parentTemplate = `
{{define "child"}}
<p>Name: {{.Name}}, Age: {{.Age}}</p>
{{end}}
<!DOCTYPE html>
<html>
<head>
<title>Parent Template</title>
</head>
<body>
{{template "child" .}}
</body>
</html>
`
parentData := struct {
Name string
Age int
}{
Name: "John",
Age: 30,
}
tmpl, err := template.New("parent").Parse(parentTemplate)
if err != nil {
fmt.Println("Error parsing parent template:", err)
return
}
err = tmpl.Execute(os.Stdout, parentData)
if err != nil {
fmt.Println("Error executing parent template:", err)
return
}
}
package main
import (
"encoding/json"
"fmt"
"os"
"text/template"
)
type TreeNode struct {
Name string `json:"name"`
MetaInfo string `json:"metaInfo"`
}
type MetaItem struct {
Name string `json:"name"`
Value interface{} `json:"value"`
}
func ParseMetaInfo(metaInfo string) []MetaItem {
var metaItems []MetaItem
json.Unmarshal([]byte(metaInfo), &metaItems)
return metaItems
}
func main() {
const tmplStrName1 = `{{- define "name1"}}Name: {{.Name}}{{- end}}`
const tmplStrMeta1 = `{{- define "meta1"}}- Name: {{.Name}}, Value: {{.Value}}{{- end}}`
const tmplStr = `{{template "name1" .}}
MetaInfo:
{{- range $index, $meta := parseMetaInfo .MetaInfo }}
{{template "meta1" $meta}}
{{- end}}`
tmplFuncs := template.FuncMap{
"parseMetaInfo": ParseMetaInfo,
}
tmpl := template.New("example").Funcs(tmplFuncs)
var tmplName1 = tmpl.New("name1")
_, err := tmplName1.Parse(tmplStrName1)
if err != nil {
return
}
var tmplMeta1 = tmpl.New("meta1")
_, err = tmplMeta1.Parse(tmplStrMeta1)
if err != nil {
return
}
tmpl, err = tmpl.Parse(tmplStr)
if err != nil {
fmt.Println("Error parsing template:", err)
return
}
jsonStr := `{
"name": "root",
"metaInfo": "[{\"name\":\"size\",\"value\":3344},{\"name\":\"type\",\"value\":\"hidden\"}]"
}`
var node TreeNode
err = json.Unmarshal([]byte(jsonStr), &node)
if err != nil {
fmt.Println("Error parsing JSON:", err)
return
}
tmpl.Execute(os.Stdout, node)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment