Go語言學習筆記(四)函數

func Name ( parameter-list ) (result-list) {

  body

}

可以有多個返回值。返回值是局部變量,初始化爲對應類型的零值。

當兩個函數具有相同的形參列表和返回列表時,認爲兩個函數的類型或者簽名是相同的。 - 不看名字。

Go函數的實參是按值傳遞的。如果是引用類型(函數,指針,slice,map,通道。而數組是按值傳遞的,可以傳遞數組指針),實參會被間接修改。

有些函數的聲明沒有函數體,那說明這個函數使用除了Go以外的語言實現。


Go函數支持遞歸。

Go語言實現了可變長度的棧,大小隨着使用而增長,可達到1G左右的上限。


error是內置的接口類型,字符串。一個特殊的error是:io.EOF = errors.New("EOF")

一般情況下,一個函數返回一個非空錯誤時,其它結果都是未定義的,因此應該被忽略。

然而,有些情況下,一些函數在調用出錯時,返回部分有用的結果,比如讀取一個文件的時候發生錯誤,返回錯誤,但也返回成功讀取的字節數,這個時候應該先處理部分結果,再處理錯誤。


函數變量使得函數不僅將數據進行參數化,還將函數的行爲當作參數進行傳遞。


匿名函數,沒有名稱,可以賦值給函數變量,也可以直接進行調用。

匿名函數能夠獲取到整個詞法環境,因此裏層的函數可以使用外層函數中的變量。

func squares() func() int {

  var x int

  return func() int {

    x++

    return x * x

  }

}

f := squares()                     f1 := squares; f2 := squares

f() // 1                                 f1() // 1

f() // 4                                 f2() // 1

f() // 9                                 f1() // 4

f() // 16                               f2() // 4

函數變量不僅是一段代碼,還可以擁有狀態。 上面的結果說明,每個函數變量都有自己的代碼和狀態。

裏層的匿名函數能夠獲取和更新外層函數的局部變量。這些隱藏的變量引用就是我們把函數歸類爲引用類型,而且函數變量無法進行比較的原因。

GO程序員通常把函數變量稱爲閉包。


匿名函數需要遞歸時,必須先聲明一個函數變量,然後將匿名函數賦給這個變量。


捕獲迭代變量: ******

在循環裏面創建的所有函數變量共享相同的變量 - 一個可訪問的存儲位置,而不是固定的指。經常在循環內引入一個內部變量來解決這個問題。


延遲函數調用: ******

延遲函數在return語句之後執行,可以說,直到函數的最後一刻才執行。

函數和參數表達式,會在語句執行時求值 *************** %%%%%%%%%%%%%%%% &&&&&&&&&&&&&&&&&&

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章