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

基于Gearbox框架的Golang服务器运行panic问题求助

修复Gearbox框架下Golang服务器panic问题

我正在完善一个开发两周的Golang项目,基于Gearbox框架搭建了运行在localhost:7070的基础服务器,用于渲染HTML文件。但服务器运行约5秒后终端提示代码panic,已尝试修改main.go的方法参数及HTML文件,耗时近一小时仍无进展,附上相关代码请求排查修复:

原始main.go文件

package main

import (
    "html/template"
    _"net/http"
    gear "github.com/gogearbox/gearbox"
)

type Todo struct {
    Title string
    Done  bool
}

type TodoPageData struct {
    PageTitle string
    Todos     []Todo
}

func main() {
    tmpl := template.Must(template.ParseFiles("layout.html"))
    var Gear = gear.New()
    Gear.Get("/", func(ctx gear.Context) {
        data := TodoPageData{
            PageTitle: "My TODO list",
            Todos: []Todo{
                {Title: "Task 1", Done: false},
                {Title: "Task 2", Done: true},
                {Title: "Task 3", Done: true},
            },
        }
        tmpl.Execute(nil , data)
    })
  Gear.Start(":7070")
}

原始layout.html文件

<h1>{{.PageTitle}}</h1>
<ul>
    {{range .Todos}}
        {{if .Done}}
            <li class="done">{{.Title}}</li>
        {{else}}
            <li>{{.Title}}</li>
        {{end}}
    {{end}}
</ul>

错误原因

  • tmpl.Execute(nil, data)中传入nil作为输出目标,模板执行时会将内容写入标准输出(而非HTTP响应流),破坏了Gearbox框架的响应处理逻辑,最终触发panic。
  • 未捕获tmpl.Execute返回的错误,模板执行一旦出错,未处理的错误会直接导致程序崩溃。

修复方案

  1. 将模板输出目标替换为Gearbox上下文的响应写入器,确保内容发送到HTTP客户端。
  2. 添加错误捕获逻辑,处理模板执行异常,避免程序panic。

修复后的main.go文件

package main

import (
    "html/template"
    "log"
    gear "github.com/gogearbox/gearbox"
)

type Todo struct {
    Title string
    Done  bool
}

type TodoPageData struct {
    PageTitle string
    Todos     []Todo
}

func main() {
    tmpl := template.Must(template.ParseFiles("layout.html"))
    gb := gear.New()
    gb.Get("/", func(ctx gear.Context) {
        data := TodoPageData{
            PageTitle: "My TODO list",
            Todos: []Todo{
                {Title: "Task 1", Done: false},
                {Title: "Task 2", Done: true},
                {Title: "Task 3", Done: true},
            },
        }
        // 使用上下文响应写入器执行模板,并捕获错误
        if err := tmpl.Execute(ctx.Response().Writer(), data); err != nil {
            log.Printf("模板执行失败: %v", err)
            ctx.Status(500).Send("内部服务器错误")
            return
        }
    })
    gb.Start(":7070")
}

内容的提问来源于stack exchange,提问作者Coding with Cyril

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 23:25:59