为了账号安全,请及时绑定邮箱和手机立即绑定

使用 golang 获取 mysql 连接时出错

使用 golang 获取 mysql 连接时出错

Go
翻阅古今 2022-01-17 19:52:14
我是 golang 和 MySQL 的新手,我正在使用开发框创建一个简单的网页,使用 golang(来自 2 个文件的代码在下面)来获取输入,将输入存储到数据库中并在网页上显示输入。目前在本地使用 MySQL 作为我的数据库,我的用户名是 root,密码是 abc,我的数据库也被命名为 abc。在顶部我已经导入:  import (      _"github.com/go-sql-driver/mysql"       "database/sql"  )当我提供我的网页时,我调用我的 connectDB 函数: func init(){    INDEX_HTML , _ = ioutil.ReadFile("./templates/index.html")    connectDb() } func connectDb(){    //socket : var/run/mysqld/mysqld.sock /* connection string examples :   db, err := sql.Open("mysql", "user:password@/dbname")  user:password@tcp(localhost:5555)/dbname?tls=skip-verify&autocommit=true    TCP using default port (3306) on localhost:     user:password@tcp/dbname?charset=utf8mb4,utf8&sys_var=esc%40ped  Use the default protocol (tcp) and host (localhost:3306):    user:password@/dbname  No Database preselected:    user:password@/*/   db, err := sql.Open("mysql", "root:abc@/abc")    log.Println("DB: ", db)    checkErr(err)    // Open doesn't open a connection. Validate DSN data:    checkErr(err) }我的理解和根据https://github.com/go-sql-driver/mysql SQL.open 返回一个 * sql.DB,并且当程序遇到上面的以下代码时:/* At the top of my code i have var db = *sql.DB */log.Println("DB: ", db)我在命令提示符中得到以下内容,上面的代码注释中记录了所有类型的示例连接字符串:DB: &{0x99c410 root:abc@/abc 0 {0 0} [] [] 0 0xc820072180 false map[] map[] 0 0 0 < nil >}我的 MySQL 数据库使用给定的用户名和密码通过命令行在本地运行良好,我可以通过手动插入以下查询获得一些项目。mysql>mysql> select * from ListItems     -> ;+-------+| items |+-------+| item1 || item2 |+-------+我试图了解消息是什么以及如何连接到 mysql 数据库以运行查询并插入数据库。也许我的连接字符串有问题?尝试插入数据库时的错误示例:016/06/20 02:22:36 http: panic serving 10.1.0.5:41861: runtime error: invalid    memory address or nil pointer dereferencegoroutine 7 [running]:
查看完整描述

1 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

db问题是您声明的全局变量var db *sql.DB从未被赋值。所以它保持它的默认值,即nil. 并且试图取消引用一个 nil 指针会给你错误。


您可能认为在init函数中为该变量分配了新创建的DB实例。但是:=会创建一个新的局部变量来保存新DB实例。全局db变量保持不变。见例子。


所以改为这样做,


var err error

db, err = sql.Open("mysql", "root:abc@/abc")

同样根据我使用全局变量的经验,当您可以避免它导致难以调试的错误时。(就像这个。)我认为你可以通过connectDb返回一个DB实例来避免它。


查看完整回答
反对 回复 2022-01-17
  • 1 回答
  • 0 关注
  • 213 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信