Неверный адрес памяти или разыменование нулевого указателя в golang - PullRequest
0 голосов
/ 27 февраля 2019

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

неверный адрес памяти или разыменование нулевого указателя

Что я должен сделать, чтобы решить проблему?

Вот основной файл syntax.go:

package main

    import (
        "blog/models"
        "fmt"
        "net/http"
    )

    func main() {
       models.DbConn()

       http.HandleFunc("/books", postsIndex)
       http.ListenAndServe(":3000", nil)

    }
    func postsIndex(w http.ResponseWriter, r *http.Request) {
        if r.Method != "GET" {
            http.Error(w, http.StatusText(405), 405)
            return
        }
        bks, err := models.AllPosts()
        if err != nil {
            http.Error(w, http.StatusText(500), 500)
            return
        }
        for _, bk := range bks {
            fmt.Fprintf(w, "%s, %s", bk.Title, bk.Description)
        }
    }

и это соединение с базой данных db.go:

package models

import (
    "fmt"
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
    "log"
)
var db *sql.DB
func DbConn() {
    db, err := sql.Open("mysql","root:@/posts")

    if err != nil {
        log.Fatal(err)
    }else {
        fmt.Printf("this is working")
    }
    defer db.Close()
}

и этот файл для получения сообщений posts.go:

package models

type Post struct {

    Title  string
    Description string

}

func AllPosts() ([]*Post, error) {
    rows, err := db.Query("SELECT * FROM posts")
    if err != nil {
        return nil, err
    }
    defer rows.Close()

    bks := make([]*Post, 0)
    for rows.Next() {
        bk := new(Post)
        err := rows.Scan(&bk.Title, &bk.Description )
        if err != nil {
            return nil, err
        }
        bks = append(bks, bk)
    }
    if err = rows.Err(); err != nil {
        return nil, err
    }
    return bks, nil
}

1 Ответ

0 голосов
/ 28 февраля 2019

Если вы посмотрите на консоль, где отображается ошибка, я думаю, она покажет что-то вроде posts.go:9.В этой строке вы пытаетесь выполнить запрос к базе данных, но на тот момент соединение с базой данных уже было закрыто.

В вашем db.go есть строка

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

Эта строка создает две переменные для области действия функции и присваивает ей значения.К моменту завершения функции уже не осталось ничего, что использует переменную области действия db, поэтому соединение закрывается.Поскольку вы использовали :=, новые переменные были созданы, и вы не присвоили их var db *sql.DB.

В качестве быстрого исправления вы можете изменить первую часть метода DbConn на

var err error
db, err = sql.Open("mysql", "root@/posts")

Я добавил строку для новой переменной типа error, и теперь присваивание присваивает значения существующим переменным, а не создает новые (= vs :=)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...