Go语言中的变量作用域

1,400 阅读1分钟

今天在做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)
}