【Golang】那些容易忽略的錯誤

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變量我們已經申明過了,不能使用:= 看來第一條原則需要加一句在同一作用域中才準確了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,767評論 18 399
  • __block和__weak修飾符的區別其實是挺明顯的:1.__block不管是ARC還是MRC模式下都可以使用,...
    LZM輪回閱讀 3,374評論 0 6
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結起來就是把...
    Dove_iOS閱讀 27,216評論 30 472
  • 我從沒有想過像今天這樣渴望學習。。。 學習嘛,就是學生時代的事兒,現在這么大了,還學習什么?每個年齡階段有每個年齡...
    麥田的怪圈閱讀 345評論 2 3
  • 人的一生很簡單,健健康康的度過每一天,但對于健康來說,很多人沒有太多的去意識這個問題,覺得人嘛總會有生老病死的一天...
    哦嗯好閱讀 188評論 0 0