This article addresses the issue of retrieving struct fields from map elements within HTML templates using the html/template package in Go.
Consider the following Task struct:
<code class="go">type Task struct { Cmd string Args []string Desc string }</code>
Furthermore, a map is initialized with Task structs as values and strings as keys:
<code class="go">var taskMap = map[string]Task{ "find": Task{ Cmd: "find", Args: []string{"/tmp/"}, Desc: "find files in /tmp dir", }, "grep": Task{ Cmd: "grep", Args:[]string{"foo","/tmp/*", "-R"}, Desc: "grep files match having foo", }, }</code>
Now, let's examine the issue at hand. A template is being used to parse an HTML page:
<code class="go">func listHandle(w http.ResponseWriter, r *http.Request){ t, _ := template.ParseFiles("index.tmpl") t.Execute(w, taskMap) }</code>
The following code snippet represents the index.tmpl template:
<code class="html"><html> {{range $key, $value := .}} <li>Task Name: {{$key}}</li> <li>Task Value: {{$value}}</li> <li>Task description: {{$value.Desc}}</li> {{end}} </html></code>
This approach successfully outputs the map's keys and values, but attempts to access the Task fields within the template, for example using {{$value.Desc}}, result in errors.
The solution lies in exporting the fields you wish to access within the templates. This can be achieved by capitalizing the first letter of the field names:
<code class="go">type Task struct { Cmd string Args []string Desc string }</code>
Consequently, references to field names within the template must also be capitalized:
<code class="html"><html> {{range $key, $value := .}} <li>Task Name: {{$key}}</li> <li>Task Value: {{$value}}</li> <li>Task description: {{$value.Desc}}</li> {{end}} </html></code>
By following these steps, you can successfully retrieve and display the Desc field of each Task in the template.
The above is the detailed content of How to Access Nested Struct Fields in HTML Templates in Go?. For more information, please follow other related articles on the PHP Chinese website!