基于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返回的错误,模板执行一旦出错,未处理的错误会直接导致程序崩溃。
修复方案
- 将模板输出目标替换为Gearbox上下文的响应写入器,确保内容发送到HTTP客户端。
- 添加错误捕获逻辑,处理模板执行异常,避免程序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
相关产品推荐
相关产品推荐

