1悼尾、 :=為什么沒(méi)有報(bào)錯(cuò)傻铣,為什么有報(bào)錯(cuò)了章贞?
f, err := Create()
if err != nil {
...
}
r, err := Update()
if err != nil {
...
}
err := Get()
if err != nil {
...
}
我們知道:=可以在函數(shù)內(nèi)對(duì)變量進(jìn)行初始化并賦值,而不用申明變量的類(lèi)型非洲,具體類(lèi)型有編譯器根據(jù)其值進(jìn)行推測(cè)鸭限,有點(diǎn)像動(dòng)態(tài)語(yǔ)言的寫(xiě)法,其實(shí)這和Golang的強(qiáng)靜態(tài)語(yǔ)言的特性并不沖突两踏,好吧败京,這并不是我們的重點(diǎn);
我們發(fā)現(xiàn)Create()和Update()方法在使用:=符號(hào)之后編譯并沒(méi)有出錯(cuò)梦染,而Get()方法的這一行編譯無(wú)法通過(guò)赡麦。聰明的你一定知道Create()和Update()方法返回的err變量已經(jīng)不是同一個(gè)變量朴皆,其內(nèi)存地址也不一樣。那為什么Get()方法就錯(cuò)誤了呢泛粹?行了遂铡,我就不賣(mài)關(guān)子了,在golang語(yǔ)言中晶姊,:=左側(cè)的變量必須至少有一個(gè)是沒(méi)有申明過(guò)的扒接,這樣就很好理解出錯(cuò)的原因了。
正確的姿勢(shì):
var err error
f, err := Create()
if err != nil {
...
}
r, err := Update()
if err != nil {
...
}
err = Get()
if err != nil {
...
}
2帽借、:=在函數(shù)內(nèi)申明的局部變量會(huì)屏蔽同名全局變量的可見(jiàn)性
var s string = "hello go"
func main() {
s := "hello world"
fmt.Println(s)
}
//output: hello world
有人會(huì)問(wèn):這個(gè)地方應(yīng)該會(huì)編譯失敗呀珠增,s變量我們已經(jīng)申明過(guò)了,不能使用:= 看來(lái)第一條原則需要加一句在同一作用域中才準(zhǔn)確了砍艾。