
未检查 loadPage 返回的错误导致解引用 nil 指针,引发 invalid memory address or nil pointer dereference panic;正确处理错误并提供默认行为即可解决。
未检查 `loadpage` 返回的错误导致解引用 nil 指针,引发 `invalid memory address or nil pointer dereference` panic;正确处理错误并提供默认行为即可解决。
在 Go 官方 Wiki 教程的 HTTP 服务阶段,常见错误是忽略 loadPage(title) 可能返回的 nil 指针和非空错误(例如文件不存在、权限不足或路径错误)。当前代码中,viewHandler 直接对未校验的 p 执行 p.Title 和 p.Body 访问,一旦 loadPage 因 test.txt 未找到而返回 nil, err,程序立即 panic。
以下是修复后的完整代码(关键改动已加注释):
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
func viewHandler(w http.ResponseWriter, r *http.Request) {
title := r.URL.Path[len("/view/"):]
p, err := loadPage(title) // ✅ 不再忽略 err
if err != nil {
// ✅ 文件不存在时返回友好提示,而非 panic
http.Error(w, "Page not found", http.StatusNotFound)
return
}
// ✅ 此时 p 必然非 nil,安全访问
fmt.Fprintf(w, "<h1>%s</h1><div>%s</div>", p.Title, p.Body)
}注意事项:
-
ioutil.ReadFile(Go 1.16+ 已弃用)建议升级为os.ReadFile(需导入"os"),语义相同但更现代; - 确保运行程序时工作目录(
os.Getwd())包含test.txt—— Go 不会自动在src/...中查找,而是从当前终端执行路径读取文件;可打印filename调试路径问题; - 生产环境应避免硬编码
.txt后缀与 0600 权限,增加输入校验(如过滤..路径遍历); - 后续步骤中
editHandler和saveHandler同样需遵循“检查错误 → 分支处理”原则,避免同类问题。
通过强制错误检查与明确失败路径,不仅消除了 panic,也提升了服务健壮性——这是 Go “显式错误处理”哲学的核心实践。

















