Home > Backend Development > Golang > How to Access Struct Fields in HTML Templates when Using Maps in Go?

How to Access Struct Fields in HTML Templates when Using Maps in Go?

Susan Sarandon
Release: 2024-10-24 07:43:29
Original
628 people have browsed it

How to Access Struct Fields in HTML Templates when Using Maps in Go?

Accessing Struct Fields in HTML Templates with Go's html/template

In Go's html/template package, you can encounter challenges when accessing the fields of a struct that is stored as a value in a map. This article provides a solution to this problem, enabling you to retrieve and display individual fields of the struct within your templates.

Consider the following example, where we define a Task struct:

<code class="go">type Task struct {
   Cmd string
   Args []string
   Desc string
}</code>
Copy after login
Copy after login

We initialize a map with the Task struct 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>
Copy after login
Copy after login

Now, we want to parse an HTML page using the taskMap data using html/template:

<code class="go">func listHandle(w http.ResponseWriter, r *http.Request) {
    t, _ := template.ParseFiles("index.tmpl")
    t.Execute(w, taskMap)
}</code>
Copy after login

Here's the corresponding template, index.tmpl:

<code class="html"><html>
{{range $k, $v := .}}
   <li>Task Name: {{$k}}</li>
   <li>Task Value: {{$v}}</li>
   <li>Task Description: {{$v.Desc}}</li>
{{end}}
</html></code>
Copy after login

While accessing the $k and $v variables from the map works as expected, accessing the Desc field using {{$v.Desc}} fails. To resolve this, we need to ensure that the fields we want to access in the template are exported. In Go, fields are exported when they start with an uppercase letter.

Solution:

Modify the Task struct to export the Desc field:

<code class="go">type Task struct {
   Cmd string
   Args []string
   Desc string
}</code>
Copy after login
Copy after login

Update the map with the exported Desc field:

<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>
Copy after login
Copy after login

In the template, update the syntax to reference the exported Desc field:

<code class="html">{{range $k, $v := .}}
   <li>Task Name: {{$k}}</li>
   <li>Task Value: {{$v}}</li>
   <li>Task Description: {{$v.Desc}}</li>
{{end}}</code>
Copy after login

By following these steps, you will be able to access the struct fields in your HTML templates, allowing you to easily display and utilize the data stored in your Go maps.

The above is the detailed content of How to Access Struct Fields in HTML Templates when Using Maps in Go?. For more information, please follow other related articles on the PHP Chinese website!

source:php
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template