我有一个结构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
使用taskMap
解析html页面。
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}}
字段时,它无法正常工作。
在这种情况下,如何获得每个desc
的{{1}}?
答案 0 :(得分:2)
注意:您可以在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>