gpt4 book ai didi

mysql - 高语 : Losing scope in database

转载 作者:IT王子 更新时间:2023-10-29 02:27:55 26 4
gpt4 key购买 nike

Go 的新手,来自 .Net-land,所以请多多包涵...希望获得一些关于构建我的 Go 应用程序的指导,特别是在管理和重用数据库连接方面。

我已将我的数据库代码拆分到一个包中,以允许将数据库查找到像存储库层一样处理 sql 查找的包中。我希望能够灵活地将我的数据库层与我的应用程序服务分离,这样我就可以在必要时轻松替换我的数据库。

基本上,我正在寻找有关如何以及何时在应用程序中处理 sql 连接和保存 sql.DB 指针的指导。我需要在 main.go 中保留一个全局指针,还是可以在我的 mysql 包中管理连接?

这是我的代码:

package mysqlstorage

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

var db *sql.DB

func Connect() {
db, dberr := sql.Open(“<CONNECTION_STRING>“)

if dberr != nil {
fmt.Println(dberr)
}
}

func SaveUser(u types.User) {
// use db here!
....
}

func GetUser(id string) types.User {
// use db here!
....
}

在运行我的 main.go 并使用我的 userservices 包来尝试保存用户时,我遇到了一个问题,我似乎失去了指针的范围:-

2015/05/03 17:49:08 http: panic serving [::1]:50106: runtime error: invalid memory address or nil pointer dereference goroutine 7 [running]: net/http.func·011() 
/usr/local/Cellar/go/1.4.2/libexec/src/net/http/server.go:1130 +0xbb database/sql.(*DB).conn(0x0, 0x10, 0x0, 0x0)
/usr/local/Cellar/go/1.4.2/libexec/src/database/sql/sql.go:634 +0x7ae database/sql.(*DB).Ping(0x0, 0x0, 0x0)
/usr/local/Cellar/go/1.4.2/libexec/src/database/sql/sql.go:462 +0x3a mysqlstorage.SaveUser(0x0, 0xc20805425a, 0x7, 0xc208054280, 0x11, 0xc208054268, 0x6, 0xc208054274, 0x5)
/Users/<USERNAME>/Desktop/go/<APPNAME>/api/src/mysqlstorage/mysqlstorage.go:24
+0x35 services.CreateUser(0x57c148, 0xc2080563c0, 0xc2080329c0)
/Users/<USERNAME>/Desktop/go/<APPNAME>/api/src/services/userservices.go:30
+0x398 net/http.HandlerFunc.ServeHTTP(0x3d02a0, 0x57c148, 0xc2080563c0, 0xc2080329c0)
/usr/local/Cellar/go/1.4.2/libexec/src/net/http/server.go:1265 +0x41 github.com/gorilla/mux.(*Router).ServeHTTP(0xc20803c140, 0x57c148, 0xc2080563c0, 0xc2080329c0)
/Users/<USERNAME>/Desktop/go/<APPNAME>/api/src/github.com/gorilla/mux/mux.go:98
+0x297 net/http.(*ServeMux).ServeHTTP(0xc20803a720, 0x57c148, 0xc2080563c0, 0xc2080329c0)
/usr/local/Cellar/go/1.4.2/libexec/src/net/http/server.go:1541 +0x17d net/http.serverHandler.ServeHTTP(0xc2080543c0, 0x57c148, 0xc2080563c0, 0xc2080329c0)
/usr/local/Cellar/go/1.4.2/libexec/src/net/http/server.go:1703 +0x19a net/http.(*conn).serve(0xc208056320)
/usr/local/Cellar/go/1.4.2/libexec/src/net/http/server.go:1204 +0xb57 created by net/http.(*Server).Serve
/usr/local/Cellar/go/1.4.2/libexec/src/net/http/server.go:1751 +0x35e

任何指导将不胜感激!谢谢大家!

最佳答案

我认为您的问题是 Connect() 范围内的 dbshadowed由于您使用了 := 运算符。如果您更改方法以声明 dberr var:

func Connect() {
var dberr error
db, dberr = sql.Open(“<CONNECTION_STRING>“)

if dberr != nil {
fmt.Println(dberr)
}
}

您的代码将按预期工作

关于mysql - 高语 : Losing scope in database,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30034384/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com