網頁

2023/10/18

Golang template range html table rows

Golang html/template使用range語法遍歷集合資料物件到HTML的table的row。


事前要求

參考「Golang template range用法」了解template的range的基本用法。


範例

在專案main.go所在目錄新增一個template文字檔內容如下,為模板來源。

template

<!DOCTYPE html>
<html>
<head>
<style>
table, th, td {
  border: solid 1px #888;
  padding: 8px;
}

th {
  color: #eee;
  background: #111;
}

table {
    border-collapse:collapse;
}

tr:nth-child(even) {
  background: #eee;
}

tr:hover {
  background: #ddd;
}
</style>
</head>
<body>
    <h1>{{.Name}}</h1>
    <table>
        <thead>
            <tr>
                <th>編號</th>
                <th>名稱</th>
                <th>年齡</th>
            </tr>
        </thead>
        <tbody>
            {{range .Employees}}
            <tr>
                <td>{{.Id}}</td>
                <td>{{.Name}}</td>
                <td>{{.Age}}</td>
            </tr>
            {{end}}
        </tbody>
    </table>
</body>
</html>

下面利用go:embed讀取template檔案的內容到變數htmlTemplate

使用html/template解析模板並將資料物件套入到模板中,將結果輸出到main所在目錄下的result.html

main.go

package main

import (
    "bytes"
    _ "embed"
    "html/template"
    "os"
)

type Table struct {
    Name      string
    Employees []Employee
}

type Employee struct {
    Id   string
    Name string
    Age  int
}

//go:embed template
var htmlTemplate string

func main() {
    t := template.Must(template.New("htmlTemplate").Parse(htmlTemplate))

    employees := []Employee{
        {"1", "John", 33},
        {"2", "Mary", 28},
        {"3", "Tony", 44},
        {"4", "Bill", 22},
    }

    data := Table{
        Name:      "Employee List",
        Employees: employees,
    }
    buf := new(bytes.Buffer)
    err := t.Execute(buf, data)
    if err != nil {
        panic(err)
    }

    os.WriteFile("result.html", buf.Bytes(), 0666)

}

github



測試

程式執行後的輸出的result.html內容如下:

result.html

<!DOCTYPE html>
<html>
<head>
<style>
table, th, td {
  border: solid 1px #888;
  padding: 8px;
}

th {
  color: #eee;
  background: #111;
}

table {
    border-collapse:collapse;
}

tr:nth-child(even) {
  background: #eee;
}

tr:hover {
  background: #ddd;
}
</style>
</head>
<body>
    <h1>Employee List</h1>
    <table>
        <thead>
            <tr>
                <th>編號</th>
                <th>名稱</th>
                <th>年齡</th>
            </tr>
        </thead>
        <tbody>
            
            <tr>
                <td>1</td>
                <td>John</td>
                <td>33</td>
            </tr>
            
            <tr>
                <td>2</td>
                <td>Mary</td>
                <td>28</td>
            </tr>
            
            <tr>
                <td>3</td>
                <td>Tony</td>
                <td>44</td>
            </tr>
            
            <tr>
                <td>4</td>
                <td>Bill</td>
                <td>22</td>
            </tr>
            
        </tbody>
    </table>
</body>
</html>

沒有留言:

張貼留言