首页 > 解决方案 > golang MySQL segfaulting 一旦抽象

问题描述

基本上,我试图对 sql.db 结构进行抽象,以便为它编写我自己的函数。但是,当我尝试这样做时,它会不断出现段错误,我不知道为什么。本质上,我有一个名为 ExtendedDB 的 sql.db 抽象,它是一个包含 sql.db 的结构。我这样做是为了编写我自己的函数来作用于 ExtendedDB 结构。对它的处理发生在 mysqlhandler.go 我对较低级别的编程相对较新,所以我认为它与指针处理不当有关。任何帮助表示赞赏!

编辑:当我调用 rows.Columns() 以验证查询是否通过时,第 25 行令人恐慌。然而,奇怪的是,在调试时它会将行识别为 *sql.rows 类型,这是正确的。此外,我知道它不会出错,就好像我err != nil检查它通过了一样。

main.go

package main

import (
    "fmt"
    "log"
    "os"

    "github.com/blackcoffee77/tuilight/dbhandlers"

    _ "github.com/go-sql-driver/mysql"
    "github.com/joho/godotenv"
)

func main() {
    err := godotenv.Load()
    if err != nil {
        log.Fatal("Error loading .env file")
    }
    conn := os.Getenv("DATABASE_CONN")
    edb := dbhandlers.DBInit(conn)
    fmt.Println("here2")
    fmt.Printf("%T", edb.DB)
    rows, _ := edb.DB.Query("select * from people where id = ?", 1)

    fmt.Println(rows.Columns())
    edb.GetAll()
    fmt.Println("here6")

}

mysqlhandler.go

package dbhandlers

import (
    "database/sql"
    "fmt"
    "log"
)

type ExtendedDB struct {
    DB   *sql.DB
    Conn string
}

func (edb *ExtendedDB) getTables() *sql.Rows {
    fmt.Println("here5")
    res, _ := edb.DB.Query("select * from people where id = ?", 1)
    fmt.Println("here4")
    fmt.Println(res)
    return res
}

func (edb *ExtendedDB) GetAll() {
    tables := edb.getTables()
    fmt.Println("here3")
    fmt.Println(tables)
    // fmt.Println(tables.Columns())

}

func DBInit(conn string) *ExtendedDB {
    db, err := sql.Open("mysql", conn)
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()
    fmt.Println("got here")

    err = db.Ping()
    if err != nil {
        log.Fatal(err)
    }
    edb := ExtendedDB{DB: db, Conn: conn}
    return &edb
}

标签: mysqlgo

解决方案


deferDBinit db.Close()”函数退出时与数据库断开连接


推荐阅读