如何在Go的html /模板中获取地图元素的struct字段?

时间:2015-01-14 09:15:57

标签: templates go

我有一个结构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>

我可以成功打印$keyvalue,但是当使用Task进入{{$value.desc}}字段时,它无法正常工作。

在这种情况下,如何获得每个desc的{​​{1}}?

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>