Вы пытаетесь подключиться к неинициализированному соединению с базой данных. Это связано с изменением теней.
Хотя вы определили глобальную db
переменную:
var db *sql.DB
Ваш метод main()
создает новый при подключении:
db, err := sql.Open(dbDriver, dbUser+":"+dbPass+"@tcp(db:3306)/"+dbName)
Итак, когда вы вызываете fetchInstances
, который использует глобальную переменную, глобальная переменная все еще не установлена.
Самое простое решение - изменить код в main()
следующим образом:
var err error
db, err = sql.Open(dbDriver, dbUser+":"+dbPass+"@tcp(db:3306)/"+dbName)
Но лучшее решение - никогда не использовать глобальную переменную. Используйте локально определенную переменную в main
, затем передайте ее в fetchInstances
.
В качестве примечания: ВСЕГДА, ВСЕГДА проверяйте свои ошибки. Дважды в вашем коде вы не можете проверить ошибки соединения с БД, как в:
db, err := sql.Open(dbDriver, dbUser+":"+dbPass+"@tcp(db:3306)/"+dbName)
err = db.Ping()
if err != nil {
fmt.Println(err)
os.Exit(1)
}
Если соединение не установлено, ваш db.Ping()
вызов, скорее всего, вызовет панику. Вместо этого вы должны сделать:
db, err := sql.Open(dbDriver, dbUser+":"+dbPass+"@tcp(db:3306)/"+dbName)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
err = db.Ping()
if err != nil {
fmt.Println(err)
os.Exit(1)
}