Go语言中的变量作用域

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

复制代码

转载于:https://juejin.im/post/5c3c93b5518825260c5cfc47

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值