为了账号安全,请及时绑定邮箱和手机立即绑定

Go中如何遍历[]map[string]interface{}生成html表格

Go中如何遍历[]map[string]interface{}生成html表格

Go
胡说叔叔 2023-01-03 17:25:32
html/template我正在尝试使用in生成 HTML 内容Go。数据实际上是SELECT来自不同MySQL表的查询的输出。我需要以下方面的帮助能够生成 HTML 但无法拆分行。如何迭代result := []map[string]interface{}{}(我使用接口,因为列数和它的类型在执行之前是未知的)以表格格式呈现数据?列和行不匹配注意:目前result在 playground 链接中包含 2 张地图,应将其视为动态地图。它会根据目标表而改变。这是 playground 链接,其中包含与我的用例匹配的示例数据。 https://go.dev/play/p/UTL_j1iRyoG下面是输出 HTML,它将所有值添加为单行,这也不与 Columns 匹配。<html>    <head>        <meta charset="UTF-8">        <title>My page</title>        <style>        table, th, td {          border: 1px solid black;        }        th, td {          padding: 10px;        }        </style>    </head>    <body>    <table>        <tr>        <th>Name</th><th>Colour</th>        </tr>        <tr>        <td>Red</td><td>Apple</td><td>Banana</td><td>Yellow</td>        </tr>    </table>    </body></html>
查看完整描述

1 回答

?
慕妹3242003

TA贡献1824条经验 获得超6个赞

您可以执行以下操作:


var cols []string

var rows [][]interface{}


for key, _ := range result[0] {

    cols = append(cols, key)

}


for _, res := range result {

    vals := make([]interface{}, len(cols))

    for i, col := range cols {

        vals[i] = res[col]

    }

    rows = append(rows, vals)

}

data := struct {

    Title   string

    Columns []string

    Rows    [][]interface{}

}{

    Title:   "My page",

    Columns: cols,

    Rows:    rows,

}

并且需要相应地修改 HTML:


<table>

    <tr>

    {{range .Columns}}<th>{{ . }}</th>{{else}}<div><strong>no rows</strong></div>{{end}}

    </tr>

    {{- range .Rows}}

    <tr>

    {{range .}}<td>{{ . }}</td>{{end}}

    </tr>

    {{- end}}

</table>

https://go.dev/play/p/MPJOMlfQ488


请注意,在 Go 中,映射是无序的,因此循环result[0]聚合列名将产生一个无序的[]string. 这意味着多次查看您的 HTML 页面的用户将看到不一致的输出。如果这是您想避免的事情,您可以选择使用 package 对列进行排序,或者您可以选择以某种方式sort保留顺序。sql.Rows.Columns


查看完整回答
反对 回复 2023-01-03
  • 1 回答
  • 0 关注
  • 287 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信