【问题标题】:nested range in Go templateGo模板中的嵌套范围
【发布时间】:2016-04-05 11:27:12
【问题描述】:

我有这样的结构

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>

【问题讨论】:

    标签: html templates go range


    【解决方案1】:

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

    {{$val.Communication}}

    由于您希望将这些条目分别放在单独的 &lt;td&gt;s 中,因此如果您可以将它们放在 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 中查看这些内容

    【讨论】:

    • 谢谢 A H 如何检查 if ($comm.Type == "Mobile") 因为我想在我的表格的移动列下显示它
    • 第一个值是否总是“Mobile”?如果您不知道顺序,如果可能的话,您可以使用地图而不是切片?喜欢{"moblie": "12345", "email": "some@email.com"}
    • 再次感谢 AH 的及时回复。不幸的是,我无法更改结构格式。有些用户只有电子邮件,有些用户只有手机,有些两者都有,所以我需要检查类型有什么办法吗?
    • 我想不出一个简单的方法:(您可以遍历列表并找到 mobileemail 值并将它们传递给模板。也许其他人有答案。并且我认为您应该编辑问题以包含您预期的 html 输出。
    • 哈代,我更新了我的答案。很多。这是我能想到的最佳答案。
    猜你喜欢
    • 2013-07-04
    • 2017-11-30
    • 2011-09-28
    • 1970-01-01
    • 2021-09-16
    • 2021-09-14
    • 2011-03-19
    • 2020-09-15
    • 2014-09-30
    相关资源
    最近更新 更多