Go語言中的變數作用域

bigpengry發表於2019-01-14

今天在做web開發時遇到了一個問題

Go語言中的變數作用域

後來發現是變數作用域的問題,在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)
}

複製程式碼

相關文章