2014-09-30 2 views
1

Я продолжаю получать эту ошибку, когда запускаю код Go, который делает запросы к моей локальной базе данных postgres.Перейти: неверная ошибка адреса памяти при запуске запросов postgres

Ошибка:

panic serving [::1]:56708: runtime error: invalid memory address or nil pointer dereference 
goroutine 23 [running]: 
net/http.func·011() 
    /usr/local/go/src/pkg/net/http/server.go:1100 +0xb7 
runtime.panic(0x2ef0a0, 0x4d8ee4) 
    /usr/local/go/src/pkg/runtime/panic.c:248 +0x18d 
database/sql.(*DB).conn(0x0, 0x277a1, 0x0, 0x0) 
    /usr/local/go/src/pkg/database/sql/sql.go:625 +0x751 
database/sql.(*DB).Ping(0x0, 0x0, 0x0) 
    /usr/local/go/src/pkg/database/sql/sql.go:452 +0x39 
main.firstHandler(0x58e9a8, 0xc208052320, 0xc2080284e0) 
    /Users/Tommy/Documents/gocode/server/server.go:122 +0x35 
net/http.HandlerFunc.ServeHTTP(0x3c6be8, 0x58e9a8, 0xc208052320, 0xc2080284e0) 
    /usr/local/go/src/pkg/net/http/server.go:1235 +0x40 
github.com/gorilla/mux.(*Router).ServeHTTP(0xc2080186e0, 0x58e9a8, 0xc208052320, 0xc2080284e0) 
    /Users/Audrey/gocode/src/github.com/gorilla/mux/mux.go:98 +0x292 
net/http.(*ServeMux).ServeHTTP(0xc208022660, 0x58e9a8, 0xc208052320, 0xc2080284e0) 
    /usr/local/go/src/pkg/net/http/server.go:1511 +0x1a3 
net/http.serverHandler.ServeHTTP(0xc208004660, 0x58e9a8, 0xc208052320, 0xc2080284e0) 
    /usr/local/go/src/pkg/net/http/server.go:1673 +0x19f 
net/http.(*conn).serve(0xc208050500) 
    /usr/local/go/src/pkg/net/http/server.go:1174 +0xa7e 
created by net/http.(*Server).Serve 
    /usr/local/go/src/pkg/net/http/server.go:1721 +0x313 

Перейти:

func firstHandler(w http.ResponseWriter, r *http.Request) { 
    err := db.Ping() 
    if err != nil { 
     log.Fatal(err) 
    } 
    rows, err := db.Query("SELECT id, created_at, updated_at FROM script WHERE updated_at = $1", 3) 
    if err != nil { 
     log.Fatal(err) 
    } 
    defer rows.Close() 

    var created_at, updated_at, id int 
    for rows.Next() { 
     err := rows.Scan(&id, &created_at, &updated_at) 
     if err != nil { 
      log.Fatal(err) 
     } 
     fmt.Fprintf("%s %s %s", id, created_at, updated_at) 
    } 
} 

var r = mux.NewRouter() 
var db *sql.DB 

func main() { 
    db, err := sql.Open("postgres", "user=Tommy host=localhost dbname=dbgo sslmode=verify-full") 
    if err != nil { 
     log.Fatal(err) 
    } 
    defer db.Close() 

    r.HandleFunc("/ping", firstHandler) 

    http.Handle("/", r) 

    http.ListenAndServe(":8080", nil) 
} 

Помощь. Что я делаю не так? Я также упомянул об этом: https://gophercasts.io/lessons/4-postgres-basics.

+0

Где находится стэкс-strace? Он должен указать вам точную точку, где вы разыменовали нулевой указатель. – JimB

+0

Я обновил свой код. Вы имеете в виду это? Однако я не могу найти точную точку. – user3918985

+0

Что на линии 42? Я не вижу функцию ReadAllContent. – OneOfOne

ответ

8

На самом деле, вы объявляете связь с:

var db *sql.DB 

но открыть соединение с:

db, err := sql.Open("postgres", "user=Tommy host=localhost dbname=dbgo sslmode=verify-full") 

Записка: = (он сочетает объявление переменной с заданием). Это фактически затеняет глобальную переменную db на локальную. Соединение открывается, но назначается локальной переменной. Таким образом, значение глобальной переменной db равно nil.

Когда функция firstHandler вызывается, ее значение по-прежнему равно нулю, что вызывает панику.

Замените: = на a = (и объявите объект err раньше).

+0

В качестве альтернативы, избегайте глобальных переменных. – dyoo

Смежные вопросы