我是 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/