亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何將連接參數 db 傳遞給 main.go?

如何將連接參數 db 傳遞給 main.go?

Go
慕無忌1623718 2023-06-01 15:04:17
我現在的作品有問題。我使用 beego 框架構建了一個應用程序,我是 golang 的新手。首先,我構建了另一個名為 utils 的包,然后我從該包中編寫了一些代碼來訪問我的數據庫func InitFirebird() {    var (        dbDriver   = beego.AppConfig.String("DB_CONNECTION")        dbUsername = beego.AppConfig.String("DB_USERNAME")        dbPassword = beego.AppConfig.String("DB_PASSWORD")        dbServer   = beego.AppConfig.String("DB_HOST")        // dbPort     = beego.AppConfig.String("DB_PORT")        dbFileName = beego.AppConfig.String("DB_DATABASE")    )    conn, _ := sql.Open(dbDriver, dbUsername+":"+dbPassword+"@"+dbServer+"/"+dbFileName)    defer conn.Close()}之后,我轉到我的 main.go 并像這樣設置我的 init 函數和 main 函數:func init() {    utils.InitFirebird()}func main() {    if beego.BConfig.RunMode == "dev" {        beego.BConfig.WebConfig.DirectoryIndex = true        beego.BConfig.WebConfig.StaticDir["/swagger"] = "swagger"        }    var n int    conn.QueryRow("SELECT Count(*) FROM rdb$relations").Scan(&n)    fmt.Println("Relations count=", n)    beego.Run()}當我重新啟動我的應用程序時,出現錯誤并向我提供此消息:\main.go:23:2: undefined: conn我該如何解決這個問題?Anyhelp將不勝感激
查看完整描述

1 回答

?
紅顏莎娜

TA貢獻1842條經驗 獲得超13個贊

首先,如果你想從另一個包中訪問某些東西,它必須被導出。在 Go 中,如果你想導出一些東西,你可以用首字母大寫來命名它(在你的例子中,它應該Conn代替conn)。


其次,當你使用它時,defer它會在函數返回時被執行。在您的情況下,它會立即返回,因此連接會立即關閉。


解決方案:


var Conn *sql.DB

func InitFirebird() {

? ? var (

? ? ? ? dbDriver? ?= beego.AppConfig.String("DB_CONNECTION")

? ? ? ? dbUsername = beego.AppConfig.String("DB_USERNAME")

? ? ? ? dbPassword = beego.AppConfig.String("DB_PASSWORD")

? ? ? ? dbServer? ?= beego.AppConfig.String("DB_HOST")

? ? ? ? // dbPort? ? ?= beego.AppConfig.String("DB_PORT")

? ? ? ? dbFileName = beego.AppConfig.String("DB_DATABASE")

? ? )

? ? Conn, _ = sql.Open(dbDriver, dbUsername+":"+dbPassword+"@"+dbServer+"/"+dbFileName)

}

現在在你的主包中:


func init() {

? ? utils.InitFirebird()

}


func main() {

? ? if beego.BConfig.RunMode == "dev" {

? ? ? ? beego.BConfig.WebConfig.DirectoryIndex = true

? ? ? ? beego.BConfig.WebConfig.StaticDir["/swagger"] = "swagger"

? ? ? ? }


? ? var n int

? ? defer utils.Conn.Close() // <-- Close here


? ? utils.Conn.QueryRow("SELECT Count(*) FROM rdb$relations").Scan(&n)

? ? fmt.Println("Relations count=", n)


? ? beego.Run()

}

這里Close()不會立即執行,因為beego.Run()會阻塞。


PS: 不推薦使用全局變量傳遞數據庫連接。


查看完整回答
反對 回復 2023-06-01
  • 1 回答
  • 0 關注
  • 161 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號