今天在做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)
}
复制代码