panic: sql: Register called twice for driver mysql
文章目录
go-sql-driver 包中包含 init 方法,只要导入包就会被执行,但是按照其实现,该包只能够被导入一次,但是因为 vendor 的作用,会出现该包出现被导入多次的情况,从而在使用次包的时候,最好不要添加 vendor
问题复现
代码
目录结构
|
|
hello.go
|
|
main.go
|
|
现象分析
流程
- main 包导入 hello 包
- hello 包执行导入 go-sql-driver 包,使用的包为 vendor 的包
- 执行 verdor go-sql-driver 包中的 init 方法
- main 执行导入 go-sql-driver 包,使用包为 GOPATH 中的包
- 执行 GOPATH go-sql-driver 包中的 init 方法
go-sql-driver init 源码
|
|
其中 sql 包为 golang 官方包 "database/sql"
结论
sql.Register("mysql", &MySQLDriver{})
被执行两次导致 panic
解决方案
github.com/go-sql-driver/mysql
这个包最好不要加到 vendor 中.这样就不会导致`init`方法被执行两次.
文章作者 Ward Harris
上次更新 2019-06-22