如何在 Go 的 html/template 中获取映射元素的结构字段?
How can I get the struct field of a map elem in Go's html/template?
我有一个结构 Task
:
type Task struct {
cmd string
args []string
desc string
}
然后我初始化了一个映射,它将上面的 Task
结构作为值,string
作为键(任务名称)
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",
},
}
我想使用 html/template
解析 html 页面,仅使用上面的 taskMap
.
func listHandle(w http.ResponseWriter, r *http.Request){
t, _ := template.ParseFiles("index.tmpl")
t.Execute(w, taskMap)
}
这里是 index.tmpl
:
<html>
{{range $key, $value := .}}
<li>Task Name: {{$key}}</li>
<li>Task Value: {{$value}}</li>
<li>Task description: {{$value.desc}}</li>
{{end}}
</html>
我可以成功打印$key
和value
,但是当涉及到Task
的字段时,使用{{$value.desc}}
就不行了。
在这种情况下,如何获得每个 task
的 desc
?
注意:您可以 try/check 在 Go Playground.
中输出修改后的代码
如果您希望 template
包能够访问这些字段,您必须导出这些字段。您可以导出以大写字母开头的字段:
type Task struct {
cmd string
args []string
Desc string
}
请注意,我只在此处更改了 Desc
,您必须将要在模板中引用的任何其他字段大写。
导出后,将所有引用更改为大写 Desc
当然:
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",
},
}
还有模板中的:
<html>
{{range $key, $value := .}}
<li>Task Name: {{$key}}</li>
<li>Task Value: {{$value}}</li>
<li>Task description: {{$value.Desc}}</li>
{{end}}
</html>
输出:
<html>
<li>Task Name: find</li>
<li>Task Value: {find [/tmp/] find files in /tmp dir}</li>
<li>Task description: find files in /tmp dir</li>
<li>Task Name: grep</li>
<li>Task Value: {grep [foo /tmp/* -R] grep files match having foo}</li>
<li>Task description: grep files match having foo</li>
</html>
我有一个结构 Task
:
type Task struct {
cmd string
args []string
desc string
}
然后我初始化了一个映射,它将上面的 Task
结构作为值,string
作为键(任务名称)
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",
},
}
我想使用 html/template
解析 html 页面,仅使用上面的 taskMap
.
func listHandle(w http.ResponseWriter, r *http.Request){
t, _ := template.ParseFiles("index.tmpl")
t.Execute(w, taskMap)
}
这里是 index.tmpl
:
<html>
{{range $key, $value := .}}
<li>Task Name: {{$key}}</li>
<li>Task Value: {{$value}}</li>
<li>Task description: {{$value.desc}}</li>
{{end}}
</html>
我可以成功打印$key
和value
,但是当涉及到Task
的字段时,使用{{$value.desc}}
就不行了。
在这种情况下,如何获得每个 task
的 desc
?
注意:您可以 try/check 在 Go Playground.
中输出修改后的代码如果您希望 template
包能够访问这些字段,您必须导出这些字段。您可以导出以大写字母开头的字段:
type Task struct {
cmd string
args []string
Desc string
}
请注意,我只在此处更改了 Desc
,您必须将要在模板中引用的任何其他字段大写。
导出后,将所有引用更改为大写 Desc
当然:
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",
},
}
还有模板中的:
<html>
{{range $key, $value := .}}
<li>Task Name: {{$key}}</li>
<li>Task Value: {{$value}}</li>
<li>Task description: {{$value.Desc}}</li>
{{end}}
</html>
输出:
<html>
<li>Task Name: find</li>
<li>Task Value: {find [/tmp/] find files in /tmp dir}</li>
<li>Task description: find files in /tmp dir</li>
<li>Task Name: grep</li>
<li>Task Value: {grep [foo /tmp/* -R] grep files match having foo}</li>
<li>Task description: grep files match having foo</li>
</html>