Задать вопрос
@VadimRublev
Go, front-end (ванильный).

Почему, при выносе пула соединений на уровень файла, паникует?

Вот так запрос к БД работает нормально:
import (
    _ "github.com/go-sql-driver/mysql"
)

func DBRout() {
    // Пул подключений.
    db, err_DB := sql.Open("mysql", ConnectDB)
	    if err_DB != nil {
		    fmt.Println("ERROR creating database connection pool:", err_DB)
		}
		defer db.Close()
	
        db_ss.SetMaxOpenConns(25)
        db_ss.SetMaxIdleConns(2)
        db_ss.SetConnMaxLifetime(time.Minute)
		
	// Запрос.
	var err_DBQuery = db.QueryRow("SELECT COUNT(*) FROM `TabTab` WHERE `Col_User` = ? AND ColumnID = ?, 3, UName).Scan(&row_search)
	    if err_DBQuery != nil {
		fmt.Println("Query error:", err_DBQuery)
	        return
	    }
}

func main() {
    var mux = http.NewServeMux()
	mux.HandleFunc("/routDB/", DBRout)
	var serv = &http.Server {
	    ...параметры...
	}
	log.Fatal(serv.ListenAndServeTLS(TLScert, TLSkey))
}


А когда выношу пул соединений на уровень файла - паникует.
import (
    _ "github.com/go-sql-driver/mysql"
)

var db *sql.DB

func DBRout() {		
	// Запрос.
	var err_DBQuery = db.QueryRow("SELECT COUNT(*) FROM `TabTab` WHERE `Col_User` = ? AND ColumnID = ?, 3, UName).Scan(&row_search)
	    if err_DBQuery != nil {
			fmt.Println("Query error:", err_DBQuery)
		    return
		}
}

func main() {
    // Пул подключений.
    db, err_DB := sql.Open("mysql", ConnectDB)
	if err_DB != nil {
	    fmt.Println("ERROR creating database connection pool:", err_DB)
	}
	defer db.Close()
	
        db_ss.SetMaxOpenConns(25)
        db_ss.SetMaxIdleConns(2)
        db_ss.SetConnMaxLifetime(time.Minute)

    var mux = http.NewServeMux()
	mux.HandleFunc("/routDB/", DBRout)
	var serv = &http.Server {
	    ...параметры...
	}
	log.Fatal(serv.ListenAndServeTLS(TLScert, TLSkey))
}


Выводит в консоль:
2021/12/27 04:02:13 http2: panic serving 127.0.0.1:59951: runtime error: invalid memory address or nil pointer dereference
goroutine 136 [running]: ...

Ну не фигня ли?? )
  • Вопрос задан
  • 213 просмотров
Подписаться 2 Простой Комментировать
Решения вопроса 1
@deliro
Ну не фигня ли?? )

Нет, ведь у тебя две разных переменные с одним именем — db

Очень удобное правило

Когда что-то работает не так, как ты ожидаешь, вини в первую очередь себя, компилятор и рантайм на 99.99999% прав, крайне маловероятно, что с опытом меньше пары лет в языке, ты сможешь найти в нём баг.


Да и вообще, никогда не создавай глобальных переменных. В продуктовом коде они не нужны в 100% случаев
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы