You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何解决GORM中的“runtime error: invalid memory address or nil pointer dereference”错误

解决Golang GORM空指针Panic问题

嘿,我一眼就看出你遇到的问题啦!你触发的invalid memory address or nil pointer dereference错误,核心原因是全局的db变量没有被正确初始化

问题根源分析

在你的main函数里,你写了这样一行代码:

db, err := gorm.Open("sqlite3", "gorm.db")

这里的:=是Go语言的短变量声明运算符,它会在main函数的局部作用域里创建一个新的db变量,而不是给你在全局声明的var db *gorm.DB赋值。这就导致当getEffects函数调用db.Find(&effects)时,全局的db仍然是nil,自然就触发了空指针 panic。

修复方案

只需要把main函数里的短变量声明改成赋值操作,同时别忘了检查数据库连接的错误:

func main () {
    // 把 := 改成 =,给全局db变量赋值
    db, err = gorm.Open("sqlite3", "gorm.db")
    // 必须检查连接错误,避免后续操作无意义执行
    if err != nil {
        log.Fatalf("无法连接数据库: %v", err)
    }
    defer db.Close()
    // 初始化路由
    r:= mux.NewRouter()
    r.HandleFunc("/effects", getEffects).Methods("GET")
    // 在5080端口启动服务
    log.Fatal(http.ListenAndServe(":5080",r))
}

额外进阶建议

作为新手,用全局变量管理数据库连接虽然简单,但在复杂项目里不太推荐。后续你可以尝试用依赖注入的方式传递DB连接,比如把db作为参数传递给路由处理函数,或者用结构体封装DB实例,这样代码的可测试性和扩展性会更好。

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

火山引擎 最新活动