在 Go 的 html/template 包中,访问存储的结构体字段时可能会遇到挑战作为地图中的值。本文提供了此问题的解决方案,使您能够检索并显示模板中结构体的各个字段。
考虑以下示例,其中我们定义了一个 Task 结构体:
<code class="go">type Task struct { Cmd string Args []string Desc string }</code>
我们使用 Task 结构体作为值,字符串作为键来初始化一个映射:
<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>
现在,我们想要使用 html/template 使用 taskMap 数据来解析 HTML 页面:
<code class="go">func listHandle(w http.ResponseWriter, r *http.Request) { t, _ := template.ParseFiles("index.tmpl") t.Execute(w, taskMap) }</code>
这是相应的模板,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>
虽然从映射中访问 $k 和 $v 变量按预期工作,但使用 {{$v.Desc}} 访问 Desc 字段失败。为了解决这个问题,我们需要确保导出模板中要访问的字段。在 Go 中,字段以大写字母开头时会被导出。
修改 Task 结构体以导出 Desc 字段:
<code class="go">type Task struct { Cmd string Args []string Desc string }</code>
更新映射使用导出的 Desc 字段:
<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>
在模板中,更新语法以引用导出的 Desc 字段:
<code class="html">{{range $k, $v := .}} <li>Task Name: {{$k}}</li> <li>Task Value: {{$v}}</li> <li>Task Description: {{$v.Desc}}</li> {{end}}</code>
通过执行以下步骤,您将能够访问HTML 模板中的结构字段,使您可以轻松显示和利用存储在 Go 地图中的数据。
以上是在 Go 中使用 Map 时如何访问 HTML 模板中的结构体字段?的详细内容。更多信息请关注PHP中文网其他相关文章!