登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-03-13 08:18:27 262浏览 收藏

今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《取消引用 golang 中的无效内存地址或 nil 指针》,主要内容是讲解等等,感兴趣的朋友可以收藏或者有更好的建议在评论提出,我都会认真看的!大家一起进步,一起学习!

问题内容

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

无效的内存地址或 nil 指针取消引用

我应该做什么来解决这个问题?

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

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

理论要掌握,实操不能落!以上关于《取消引用 golang 中的无效内存地址或 nil 指针》的详细介绍,大家都掌握了吧!如果想要继续提升自己的能力,那么就来关注golang学习网公众号吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>