运行时错误:无效的内存地址或零指针取消引用(2)

我是Go的新手,需要帮助!

在 PostgreSQL 数据库中,我有一个名为factors. 此表有 2 列(factor_idfactor_name)。现在我已经成功地从 Go 应用程序连接到 PostgreSQL 数据库。

当我试图在控制台中发出基于查询的 GET 请求时,我看到了错误。

http://localhost:8000/api/factors/?limit=5&offset=1

我哪里弄错了?请帮我解决这个问题。

控制器/factors.go

package controllers


import (

    "encoding/json"

    "fmt"

    "net/http"

    "restify/models"

    "restify/utils"

)


var GetFactors = func(res http.ResponseWriter, req *http.Request) {

    data := models.Factors{}


    err := models.GetFactors(&data, req.URL.Query().Get("limit"), req.URL.Query().Get("offset"))

    if err != nil {

        fmt.Println(err.Error())

        http.Error(res, err.Error(), 500)

        return

    }


    out, err := json.Marshal(data)

    if err != nil {

        fmt.Println(err.Error())

        http.Error(res, err.Error(), 501)

        return

    }


    resp := make(map[string]interface{})


    resp["Dictionaries"] = string(out)


    utils.Respond(res, resp)


}


一只斗牛犬
浏览 80回答 1
1回答

沧海一幻觉

似乎问题是在此处分配数据库时:DB, err := sql.Open("postgres", dbURL)数据库在新范围内定义,因此这会创建一个局部变量而不是设置 pkg 级变量。因此,代码Open()建立了与数据库的连接。试试这个:var err error DB, err = sql.Open("postgres", dbURL)这是官方报价:与常规变量声明不同,短变量声明可以重新声明变量,前提是它们最初是在同一块(如果块是函数体,则为参数列表)中较早声明的,具有相同的类型,并且至少有一个非空变量是新的。因此,重新声明只能出现在多变量简短声明中。重新声明不会引入新变量;它只是为原始值分配了一个新值。
打开App,查看更多内容
随时随地看视频慕课网APP