Go 語言短變量聲明的“坑”
1.介紹
在使用 Go 語言進行項目開發時,我們經常會在定義變量時使用 Go 語言的一個語法糖 - 短變量聲明,它雖然好用,但是也會有讓我們不小心就會掉進的“坑”。
本文我們介紹一個 Go 語言短變量聲明最容易讓程序員掉進的“坑”。
2.短變量聲明的“坑”
Go 語言提供了短變量聲明的語法糖,短變量聲明讓 Go 語言的變量聲明更加方便,代碼更加簡潔。但是,它真的百利無一害嗎?
我們先閱讀一段示例代碼:
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)
}
}
輸出結果:
val:frank || ptr:0xc000010200
val:lucy || ptr:0xc000010200
18
val:lily || ptr:0xc000010230
閱讀上面這段代碼,我們先使用通用的 Go 語言變量聲明方式聲明變量 name?,然后再使用 Go 語言語法糖 - 短變量聲明方式,分別在同一作用域和不同作用域聲明變量 name。
首先,我們忽略在同一作用域使用短變量聲明時的變量 age,僅是為了跳過 Go 編譯器的檢查。
根據三次聲明變量 name? 的打印結果可以看出,使用短變量聲明方式在同一作用域聲明變量 name?,僅是對變量 name 重新賦值,而不是聲明一個新變量。
所以,我們得出一個結論:在同一作用域使用短變量聲明方式進行變量聲明時,針對重名變量,不會重新生成一個新變量,而是對重名變量進行重新賦值。
3.總結
本文我們主要介紹一個使用 Go 語言短變量聲明方式進行變量聲明時,我們非常容易踩的“坑”。
雖然問題比較簡單,但是越是簡單的問題越不容易排查,這就要求提升程序員對 Go 語言相關知識的掌握水平,盡量避免在開發時出現此類問題,導致可能會花費大量時間排查問題。
最后,我們牢記 Go 語言的短變量聲明語法糖在相同作用域和不同作用域的含義可能會不同,要注意區分聲明新變量和重新賦值變量。?