Go模板中的嵌套范围

时间:2016-04-05 11:27:12

标签: html templates go range

我有这样的结构

type Users struct{  
    Name           string           `json:"Name,omitempty"`  
    Gender         string           `json:"Gender,omitempty"`  
    Communication  []*Communication `json:"Communication,omitempty"`  
}  

type Communication struct {  
    Type  string `json:"Type,omitempty"`  
    Value string `json:"Value,omitempty"`  
}  

每个用户都有两个通信结构,如

[
    {
        "Type": "MOBILE",
        "Value": "12121212"
    },
    {
        "Type": "Email",
        "Value": "Some@email.com"
    }
]  

在我的模板中,我想在表格中显示它们。我获取用户结构值,但无法获得通信结构值

HTML模板文件(部分代码):

<tbody>  
{{range $key, $val := .Users}}   
<td style="text-align: center;">{{$val.Name}}</td>  
<td style="text-align: center;">{{$val.Gender}}</td>  
///////How to display communication values here??////////////  
{{end}}  
</tbody>

1 个答案:

答案 0 :(得分:2)

您可以像访问其他字段一样访问“通信”字段。

{{$val.Communication}}

由于您希望将这些条目放在单独的<td>中,因此如果您可以将它们放在map而不是slice中,则会更容易。您可以使用类似下面的函数。

sliceToMap := func(s []*Communication) map[string]string {
    comms := map[string]string{}

    for _, c := range s {
        comms[c.Type] = c.Value
    }

    return comms
}

您可以将其注册为要在模板中使用的自定义函数,

t := template.Must(template.New("").Funcs(template.FuncMap{
    "SliceToMap": sliceToMap,
}).Parse(src))

然后你的模板就可以了,

<tbody>  
{{range $key, $val := .Users}}   
<td style="text-align: center;">{{$val.Name}}</td>  
<td style="text-align: center;">{{$val.Gender}}</td> 

{{$comms := SliceToMap $val.Communication}}

<td style="text-align: center;">{{index $comms "mobile"}}</td>
<td style="text-align: center;">{{index $comms "email"}}</td>

{{end}}  
</tbody>

请参阅Go Playground

中的内容