go - golang 中无效的内存地址或 nil 指针取消引用

标签 go

我是 go lang 的新手,到目前为止我很喜欢它但是我在运行应用程序时遇到了这个问题:

invalid memory address or nil pointer dereference

我应该怎么做才能解决这个问题?

这是主文件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
}

最佳答案

如果您查看显示错误的控制台,我猜它会显示类似 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")

我为错误类型的新变量添加了一行,赋值现在将值分配给现有变量,而不是创建新变量(= vs := )

关于go - golang 中无效的内存地址或 nil 指针取消引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54905147/

相关文章:

json - 如何从 Golang 中的 HTTP GET 请求发送 JSON 响应?

Go mod tidy 删除了 go.mod 中的 linter

go - Go 函数参数中下划线的含义

docker - Golang Docker Selenium Chrome

go - 如何使go-colly与elasticsearch Hook ?

go - 通过 Supervisor 运行时奇怪的行为 Golang 应用程序崩溃

go - 为什么永远不会调用终结器?

戈朗 : why does the word "hello" loop 5 times while the word "world" loops only 4?

http - 服务器开始监听后如何启动浏览器?

go - 或者golang模板中的语句结合gt/lt(greaterThan, lowerThan)