You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将MySQL中所有平方数数据传递至Golang HTML模板生成表格?

把数据库中所有数字平方数据展示到HTML表格的解决方案

我来帮你搞定这个需求,要实现把数据库里所有数字和对应的平方数用表格展示在index.html里,我们需要调整数据结构、查询逻辑、Handler以及模板这几个部分,一步步来:

1. 定义适配多条数据的结构体

原来的pageData只能存单个平方数,现在要存储一组记录,所以我们先定义两个结构体:

// 存储单条数字和平方数的记录
type SquareRecord struct {
    Number     int    // 原始数字
    SquareNum  int    // 对应的平方数
}

// 传递给模板的页面数据,包含所有记录的切片
type PageData struct {
    Records []SquareRecord
}

2. 修改数据库查询逻辑,获取全部数据

你原来的代码是单个查询特定数字的平方,现在要改成查询表中所有数据。注意:最好把查询逻辑移到请求Handler里(避免全局变量的问题),或者在main里查询后传递给Handler,但更推荐在Handler里处理,因为每次请求都可能需要最新数据。

在idx Handler里添加查询所有数据的逻辑:

func idx(w http.ResponseWriter, r *http.Request) {
    // 重新打开数据库连接(main里的连接会被defer关闭,所以每次请求需要新连接,或者用连接池)
    db, err := sql.Open("mysql", "root:@/godb")
    if err != nil {
        log.Println(err)
        http.Error(w, "服务器内部错误", http.StatusInternalServerError)
        return
    }
    defer db.Close()

    // 查询表中所有的数字和平方数
    rows, err := db.Query("SELECT number, squareNum FROM squarenum")
    if err != nil {
        log.Println(err)
        http.Error(w, "服务器内部错误", http.StatusInternalServerError)
        return
    }
    defer rows.Close()

    // 遍历查询结果,存入切片
    var records []SquareRecord
    for rows.Next() {
        var num, square int
        if err := rows.Scan(&num, &square); err != nil {
            log.Println(err)
            http.Error(w, "服务器内部错误", http.StatusInternalServerError)
            return
        }
        records = append(records, SquareRecord{Number: num, SquareNum: square})
    }

    // 检查遍历过程中是否出现错误
    if err := rows.Err(); err != nil {
        log.Println(err)
        http.Error(w, "服务器内部错误", http.StatusInternalServerError)
        return
    }

    // 组装页面数据,传递给模板
    pd := PageData{
        Records: records,
    }
    err = tpl.ExecuteTemplate(w, "index.html", pd)
    if err != nil {
        log.Println("模板渲染错误:", err)
        http.Error(w, "服务器内部错误", http.StatusInternalServerError)
        return
    }
}

3. 提前解析模板(避免重复解析)

在main函数之外添加模板初始化的逻辑,确保模板只解析一次:

var tpl *template.Template

// init函数会在main之前执行
func init() {
    tpl = template.Must(template.ParseFiles("index.html"))
}

4. 编写index.html模板,用表格展示数据

在模板里使用Go模板的range语法遍历所有记录,生成符合要求的表格:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>数字平方表</title>
    <style>
        table { border-collapse: collapse; margin: 2rem auto; width: 80%; }
        th, td { border: 1px solid #e0e0e0; padding: 0.8rem; text-align: center; }
        th { background-color: #f5f5f5; font-weight: bold; }
        tr:hover { background-color: #fafafa; }
    </style>
</head>
<body>
    <h1 style="text-align: center;">数字平方对照表</h1>
    <table>
        <thead>
            <tr>
                <th>计算表达式</th>
                <th>平方结果</th>
            </tr>
        </thead>
        <tbody>
            <!-- 遍历所有记录,生成表格行 -->
            {{range .Records}}
            <tr>
                <td>{{.Number}} × {{.Number}} = {{.SquareNum}}</td>
                <td>{{.SquareNum}}</td>
            </tr>
            {{end}}
        </tbody>
    </table>
</body>
</html>

完整的main函数调整

最后把main函数里的单个查询逻辑删掉,保留插入数据的部分(可以只运行一次后注释掉,避免重复插入):

func main() {
    db, err := sql.Open("mysql", "root:@/godb")
    if err != nil {
        panic(err.Error()) // 实际项目建议用更友好的错误处理
    }
    defer db.Close()

    // 插入测试数据(只需要运行一次,之后可以注释掉)
    stmtIns, err := db.Prepare("INSERT INTO squarenum VALUES(?, ?, ? )")
    if err != nil {
        panic(err.Error())
    }
    defer stmtIns.Close()

    for i := 1; i < 50; i++ {
        _, err = stmtIns.Exec(0, i, (i * i))
        if err != nil {
            panic(err.Error())
        }
    }

    fmt.Println("服务器启动在 :8888,访问 http://localhost:8888 查看结果")
    http.HandleFunc("/", idx)
    http.ListenAndServe(":8888", nil)
}

一些注意点

  • 确保你的squarenum表结构和插入语句匹配,比如表有三个字段(第一个是自增ID,所以插入时传0让数据库自动生成)。
  • 插入数据的代码只需要运行一次,之后记得注释掉,不然每次启动服务器都会重复插入数据。
  • 实际生产环境中不要用panic处理错误,应该用log.Println记录错误后返回http.Error给用户。
  • 可以优化数据库连接,使用连接池而不是每次请求都新建连接,比如设置db.SetMaxOpenConns(10)等参数。

内容的提问来源于stack exchange,提问作者mac

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:51:11