函式是構建程式的基礎部件,定義如下:
type mytype int
func (p mytype) funcname(q int) (r, s int) {return 0,0}
-
關鍵字func用於定義一個函式
-
函式可以繫結到特定的型別上,叫做“接收者”,以後會詳細介紹。
-
funcname是自己定義的函式名稱
-
int型別的變數p是輸入引數,傳值引用,會被複制。
-
r和s是這個函式的 命名返回值,可以只有型別,也可以沒有返回值。
-
函式體只有一個return語句,返回兩個值
1. 作用域
定義在函式外部的變數是全域性變數,定義在函式內部的變數是區域性變數。如果命名覆蓋-一個區域性變數與一個全域性變數有相同的名字,那麼在該函式執行的時候,區域性變數會覆蓋全域性變數。
2. 多值返回
Go的函式和方法可以返回多個值,元組沒有座位原生型別出現,所以多返回值可能是最佳的選擇。
3. 命名返回值
Go的格言:用更少的程式碼做更多的事。
-
函式的返回值可以指定一個名字,並且像原始的變數那樣使用,就像輸入引數一樣。
-
如果對其命名,在函式開始時,會用其型別的零值初始化。
-
名字不是強制的。
4. 延遲程式碼
在defer後指定的函式會在函式退出前呼叫。
-
延遲的函式是按照先進後出FILO的順序執行。
-
利用defer甚至可以修改返回值。
5. 變參
接受不定數量的引數的函式叫做變參函式,例如:
func myfunc(arg …int) {}
變數arg是一個int型別的slice,這些引數的型別全部都是int。
6. 函式作為值
函式可以賦值給變數,可以在其他地方被呼叫。
7. 回撥
函式作為引數可以在另外一個函式裡被呼叫。
8. 恐慌和恢復
Panic:是一個內建函式,可以中斷原有的控制流程,進入一個令人恐慌的流程中,但函式F呼叫panic,函式F的執行被中斷,並且F中的延遲函式會正常執行,然後F返回到呼叫它的地方。在呼叫的地方,F的行為就像呼叫了panic。這一過程繼續向上,直到程式崩潰時所有goroutine返回。
Recover:是一個內建函式,可以讓進入令人恐慌的流程中得gorountine恢復過來。recover僅在延遲函式中有效。在正常的執行過程中,呼叫recover會返回nil並且沒有其他任何效果。如果當前的gorountine陷入恐慌,呼叫recover可以捕獲到panic的輸入值,並且恢復正常的執行。
本文僅記錄了一些自認為比較重要的資訊,原書中有許多程式碼的例子和講解,更為詳細。