Go 語言短變量聲明的“坑”
1.介紹
在使用 Go 語言進(jìn)行項(xiàng)目開發(fā)時(shí),我們經(jīng)常會(huì)在定義變量時(shí)使用 Go 語言的一個(gè)語法糖 - 短變量聲明,它雖然好用,但是也會(huì)有讓我們不小心就會(huì)掉進(jìn)的“坑”。
本文我們介紹一個(gè) Go 語言短變量聲明最容易讓程序員掉進(jìn)的“坑”。
2.短變量聲明的“坑”
Go 語言提供了短變量聲明的語法糖,短變量聲明讓 Go 語言的變量聲明更加方便,代碼更加簡(jiǎn)潔。但是,它真的百利無一害嗎?
我們先閱讀一段示例代碼:
func main() {
var name string = "frank"
fmt.Printf("val:%s || ptr:%p\n", name, &name)
name, age := "lucy", 18
fmt.Printf("val:%s || ptr:%p\n", name, &name)
fmt.Println(age)
if name != "lily" {
name := "lily"
fmt.Printf("val:%s || ptr:%p\n", name, &name)
}
}
輸出結(jié)果:
val:frank || ptr:0xc000010200
val:lucy || ptr:0xc000010200
18
val:lily || ptr:0xc000010230
閱讀上面這段代碼,我們先使用通用的 Go 語言變量聲明方式聲明變量 name?,然后再使用 Go 語言語法糖 - 短變量聲明方式,分別在同一作用域和不同作用域聲明變量 name。
首先,我們忽略在同一作用域使用短變量聲明時(shí)的變量 age,僅是為了跳過 Go 編譯器的檢查。
根據(jù)三次聲明變量 name? 的打印結(jié)果可以看出,使用短變量聲明方式在同一作用域聲明變量 name?,僅是對(duì)變量 name 重新賦值,而不是聲明一個(gè)新變量。
所以,我們得出一個(gè)結(jié)論:在同一作用域使用短變量聲明方式進(jìn)行變量聲明時(shí),針對(duì)重名變量,不會(huì)重新生成一個(gè)新變量,而是對(duì)重名變量進(jìn)行重新賦值。
3.總結(jié)
本文我們主要介紹一個(gè)使用 Go 語言短變量聲明方式進(jìn)行變量聲明時(shí),我們非常容易踩的“坑”。
雖然問題比較簡(jiǎn)單,但是越是簡(jiǎn)單的問題越不容易排查,這就要求提升程序員對(duì) Go 語言相關(guān)知識(shí)的掌握水平,盡量避免在開發(fā)時(shí)出現(xiàn)此類問題,導(dǎo)致可能會(huì)花費(fèi)大量時(shí)間排查問題。
最后,我們牢記 Go 語言的短變量聲明語法糖在相同作用域和不同作用域的含義可能會(huì)不同,要注意區(qū)分聲明新變量和重新賦值變量。?