Golang连接MySQL报invalid memory address空指针panic问题求助
错误原因定位
1. 直接代码逻辑问题
你调用db.Query()执行SQL后未判断返回的错误,一旦SQL执行失败,返回的getarticle(*sql.Rows类型)就是nil,后续直接调用nil.Next()就会触发空指针panic,这是报错的直接触发原因。
2. 根因:Docker容器无法访问宿主机MySQL
你的MySQL部署在宿主机的XAMPP环境中,代码里连接地址写的是127.0.0.1:3306,而Docker容器的127.0.0.1指向容器自身的回环地址,根本无法访问到宿主机的MySQL服务,导致db.Query()执行失败返回nil结果。
修复方案
- 补全所有数据库操作的错误判断
首先在db.Query()后增加错误判断逻辑,先把真实的连接错误暴露出来,避免空指针调用:
getarticle, err := db.Query("SELECT * FROM article") // 新增错误判断 if err != nil { panic(err.Error()) } // 用完记得关闭Rows避免资源泄漏 defer getarticle.Close()
同时注意你当前的Scan逻辑存在问题:SELECT *会返回article表的4个字段,你只传了1个Scan参数会触发字段不匹配错误,需要修改为和结构体字段数量、顺序匹配:
err = getarticle.Scan(&article.Author, &article.Title, &article.Body, &article.Created)
- 修正Docker访问宿主机MySQL的配置
- 修改数据库连接地址:将
127.0.0.1替换为Docker bridge网络的宿主机默认网关172.17.0.1,连接串改为root:@tcp(172.17.0.1:3306)/api_golang - 开放MySQL远程访问权限:登录宿主机MySQL执行以下SQL,允许来自Docker网关的root账号访问目标库:
GRANT ALL PRIVILEGES ON api_golang.* TO 'root'@'172.17.0.1' IDENTIFIED BY '你的MySQL root密码'; FLUSH PRIVILEGES;
- 修改MySQL绑定地址:编辑XAMPP的MySQL配置文件
my.cnf,将bind-address从127.0.0.1改为0.0.0.0,重启MySQL服务生效。
内容的提问来源于stack exchange,提问作者dhanyn10
相关产品推荐
相关产品推荐

