iT邦幫忙

2022 iThome 鐵人賽

DAY 23
0
自我挑戰組

跟著 Go 實戰聖經 一起自學 Go系列 第 23

DAY 23 Go 語言 函式 (function) 介紹及宣告函式

  • 分享至 

  • xImage
  •  

昨天介紹了在 Go 語言中的型別檢查,今天要介紹其實前面章節的範例也經常出現的函式 (function)。

Go 語言中的函式 (function)

函式 (function) 可以說是大部分程式語言的必備,我們將一段要執行程式碼放在函式裡面,需要用時呼叫函式。
在大部分其他的程式語言中,函式正常會回傳一個輸出值,但 Go 語言中函式可以完全 沒有輸入值和輸出值 ; 也可以 一次有多個輸入和輸出值
且在 Go 語言中的函式是 First-class Function ,也就是一個函式可以當作另一個函式的引數或是回傳值,而可以接收其他函數為引數的函式,也可以稱為 高階函式 (higher-order functions)

函式 (function) 的優點

上面說函式是許多程式語言的必備,但你要跟我說為什麼啊,有什麼好處呀?這邊立馬舉幾個使用函式的優點,讓大家看完之後發現函式絕對不可或缺呀~

1. 將複雜的任務分解

當今天接收到一個複雜的任務,我們可以使用函式將其分解為,由多個小小的任務組成的原本複雜任務,且當你將複雜任務分切成小小任務函式,小任務的函式更加容易寫以及讀取,且讓不同函式完成不同的任務,可以讓程式碼更加容易維護。

2. 精簡程式碼

當我們發現有重複的動作需要在很多地方執行時,這時若是將這段程式包裝成函式,且在需要用到時呼叫函式,就可以精簡程式碼,不會讓你一直寫重複的 code ,且包裝成函式也非常易於維護,今天有需要修改時,只需要修改函式內,不需要多次修改。

3. 重複使用

上面有說到我們將一段重複出現的函式包裝好後,我們便可以在多處呼叫函式,可以節省開發時間。

設計函式 (function) 的守則

要寫出函式並不困難,但是要寫出漂亮的函式絕對需要多加練習,當我們在開發定義函式時,可以經常想起以下兩個特點,一起寫出漂亮的函式吧。

單一責任制

正常來說一個函式應該只負責一件事,因為這樣測試起來較容易,且後續也較好維護。

短小精幹

保持簡潔的程式碼,可以減短除錯的時間,以及更好撰寫單元測試。

其實以上簡而言之,就是我們需要盡量將函式切分成越細越好,讓他一次只做一件事,且避免一個函式裡面有太長的程式碼,畢竟一個函式裡有 100 行程式碼,基本上就是沒有遵守單一責任制。

宣告函式

在 Go 語言中宣告函式如下:

func add(i, j, int) int {
    // 執行的程式碼
}

以上第一行翻成中文如下:

<宣告函式> <函式名稱>(<參數清單>) <回傳型別>

函式宣告

在 Go 語言中函式宣告一律使用 func 關鍵字。 func 可以在套件層級內各處用來定義函式。

函式名稱

在 Go 語言中函式名稱使用駝峰式大小寫 (camelCase) 來命名,簡單來說就是首字字母小寫,後面的單字都以大寫開頭,如: totalSum 。
且函式名稱正常可以代表這個函式的用意,就像是這個函式是在算總和的,我們會取名為 totalSum ,而不是 happyDay 真的在亂取哈哈

補充:
在 Go 語言中一般變數名稱也是使用駝峰式大小寫 (camelCase) 來命名。

參數清單

參數 (parameters) 是函數的傳入值、函式執行時所需的資料,也是函式內的區域變數。一個函式可以有很多參數,也可以都沒有參數。

<名稱 1> <型別 1>, <名稱 2> <型別 2>...

會長成如下的樣子:

name string, age int

當今天函式的參數型別都相同時,我們也可以簡化成:

name, email, address string

回傳型別

顧名思義就是回傳的資料型別,如: string、bool 等。在 Go 語言中,可以一次有多個回傳值,也可以沒有回傳值。
若函式有定義回傳型別,函式本身就需要有 return 敘述(可以有不只一個 return 敘述)。 return 敘述會使韓式停止,並回傳列在 return 後的值,而皆些值得型別必須與宣告時回傳型別相同。

補充:
在 Go 語言中,函式的左邊大括號 { 必須跟函式在同一行,若是不小心換行了,在編譯時便會出現錯誤。

今天先簡單了解在 Go 語言中函式 (function) 介紹及宣告函式,明天繼續深入探討函式,明天見~~


上一篇
DAY 22 Go 語言 型別檢查
下一篇
DAY 24 Go 語言 函式 (function) 呼叫及參數
系列文
跟著 Go 實戰聖經 一起自學 Go30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言