如何在 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>

我可以成功打印$keyvalue,但是当涉及到Task的字段时,使用{{$value.desc}}就不行了。

在这种情况下,如何获得每个 taskdesc

注意:您可以 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>