1、 :=為什么沒有報錯,為什么有報錯了?
f, err := Create()
if err != nil {
...
}
r, err := Update()
if err != nil {
...
}
err := Get()
if err != nil {
...
}
我們知道:=可以在函數內對變量進行初始化并賦值,而不用申明變量的類型,具體類型有編譯器根據其值進行推測,有點像動態語言的寫法,其實這和Golang的強靜態語言的特性并不沖突,好吧,這并不是我們的重點;
我們發現Create()和Update()方法在使用:=符號之后編譯并沒有出錯,而Get()方法的這一行編譯無法通過。聰明的你一定知道Create()和Update()方法返回的err變量已經不是同一個變量,其內存地址也不一樣。那為什么Get()方法就錯誤了呢?行了,我就不賣關子了,在golang語言中,:=左側的變量必須至少有一個是沒有申明過的,這樣就很好理解出錯的原因了。
正確的姿勢:
var err error
f, err := Create()
if err != nil {
...
}
r, err := Update()
if err != nil {
...
}
err = Get()
if err != nil {
...
}
2、:=在函數內申明的局部變量會屏蔽同名全局變量的可見性
var s string = "hello go"
func main() {
s := "hello world"
fmt.Println(s)
}
//output: hello world
有人會問:這個地方應該會編譯失敗呀,s變量我們已經申明過了,不能使用:= 看來第一條原則需要加一句在同一作用域中才準確了。