Как решить "ошибка во время выполнения: неверный адрес памяти или разыменование нулевого указателя" с помощью gorm - PullRequest
0 голосов
/ 29 сентября 2019

Я новичок в Голанге, я хочу использовать его для создания API отдыха.Я блокирую эту проблему.Я не понимаю этого, потому что функция CreateEffect работает хорошо.

Моя проблема в функции "getEffects" в строке: "db.Find (&ффекты)"

Это мой код:

var db *gorm.DB
var err error

func getEffects (w http.ResponseWriter, r *http.Request) {
    var effects []Effects
    db.Find(&effects)
    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(&effects)
}

func main () {
    db, err := gorm.Open("sqlite3", "gorm.db")
    defer db.Close()

    //Initialisation des routes
    r:= mux.NewRouter()
    r.HandleFunc("/effects", getEffects).Methods("GET")

    //Start serveur port 5080
    log.Fatal(http.ListenAndServe(":5080",r))
}

Это ошибка времени выполнения:

2019/09/28 22:46:54 http: panic serving 127.0.0.1:36488: runtime error: invalid memory address or nil pointer dereference
goroutine 27 [running]:

Полный код здесь: https://pastebin.com/sbzhK8YV

Спасибо за помощь

1 Ответ

1 голос
/ 29 сентября 2019

Когда вы пишете db, err := gorm.Open("sqlite3", "gorm.db"), вы, по сути, объявляете «новую» локальную переменную, которая затеняет глобальный «db».

Следовательно, переменная "db", используемая в db.Find(&effects), фактически никогда не инициализировалась.

Чтобы дать вам больше контекста, если вы начинаете с Go.Эта ошибка во время выполнения логически похожа на ошибку сегментации C или исключение нулевого указателя в Java.Если вы используете IDE, убедитесь, что вы настроили ее так, чтобы она отображала такие объявления как предупреждения (или даже ошибки).Повторное объявление переменной с тем же именем почти никогда не является хорошей идеей.

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