今天在做web開發時遇到了一個問題
後來發現是變數作用域的問題,在Go中使用全域性變數,可以在同一包內任意呼叫,但是,如果在某一函式內部命名了相同名字的變數的變數,系統會有限使用在函式內部宣告的變數。
var (
DB *sqlx.DB
)
func initDB(dsn string)error{
DB,err:=sqlx.Open("mysql",dsn)
if err!=nil{
return err
}
err=DB.Ping()
if err!=nil{
return err
}
DB.SetMaxIdleConns(100)
DB.SetMaxOpenConns(16)
return nil
}
複製程式碼
上面的程式碼,我首先宣告瞭一個全域性變數DB,然後在函式內部為了接受Open函式返回的值,重新寫了一句DB,err:=sqlx.Open("mysql",dsn)
,我本來以為這個語句只會新建立一個err,而DB會使用在上面建立的全域性變數。
要想解決,就要進行如下修改:
var err error
DB,err=sqlx.Open("mysql",dsn)
複製程式碼
在debug的過程中,我也發現了其它會出現這種情況的例子,下面和大家分享一下。 下面這段程式碼,宣告瞭一個指標p,然後mian函式呼叫foo()函式,foo()函式返回變數i的地址和一個err,然後我呼叫了bar()函式,最後列印p。和上面一樣,出錯了。
var p *int
func foo() (*int, error) {
var i int = 5
return &i, nil
}
func bar() {
fmt.Println(*p)
}
func main() {
p, err := foo()
if err != nil {
fmt.Println(err)
return
}
bar()
fmt.Println(*p)
}
複製程式碼