Go 語言基礎系列(五):函數

什麼是函數

那麼對於函數這個新概念,應該做怎樣的思考呢?

思維邏輯圖如下:

下面我們從以上三個方面對函數進行相應的介紹

**   函數的聲明  **

01

** 固定參數的函數聲明 **

golang 語言中,函數的聲明通過關鍵字 func 開始,標準格式如下:

func 函數名 (參數列表)(返回參數列表){

**                    函數體 **

**}
**

當然,和大多數的編程語言相似,函數名的定義有如下規則:

注:1. 函數名由字母、數字和下劃線組成

       2. 函數名不能以數字開始

       3. 在同一個包(之後我們會展開對包的概念的介紹)內不能出現相同的函數名

下面我們聲明一個函數作爲例子:聲明一個實現兩整型數相乘的函數,函數名定義爲 multipleForTwoNum

解釋:以上我們便聲明瞭一個函數,該函數具有兩個參數,函數的參數通過參數名和參數類型表示,如上圖中的 num1 int64 或者 num2 int64,返回值列表因爲我們是返回單值,所以括號可以省略

02

** 可變參數函數聲明 **

上面我們介紹了固定參數的函數聲明,在 golang 語言中還支持可變參數的聲明,格式如下:

func 函數名 (v...T)(返回參數列表){

**         函數體 **

}

注:v...T 表明 v 爲一個切片,T 爲切片中數據的類型

在上文的例子中,只能實現對兩個整數的相乘運算,下面我們聲明一個可以實現多個整數相乘運算的函數

解釋:_上面我們聲明一個可變參數的函數:multipleForNums,nums ...int64 代表 nums 爲一個切片,int64 爲切片中存儲的數據類型,所以在計算中,我們可以通過 range 關鍵字進行遍歷 _

03

** 固定參數和可變參數的函數聲明 **

01 和 02 中我們分別介紹了固定參數和可變參數的聲明,那麼假如一個函數既有固定參數又有可變參數,那麼該如何聲明呢?格式如下:

func 函數名 (固定參數列表,v...T)(返回參數列表){

**         函數體 **

}

注:可變參數位於固定參數列表之後

示例:我們聲明一個函數實現如下功能,在兩個整數相加的基礎上再乘以可變的多個整數

解釋:multipleAfterTwoNumAdd 實現了在 a 和 b 相加之後,再乘以多個倍數因子的功能,當前我們主要是爲了舉一個固定參數和可變參數結合的函數聲明的例子,例子可能不具有實用性

**   函數的分類  **

01

** 自定義函數 **

在函數的聲明小節中,我們定義的函數均可稱爲自定義函數,所以在此將不再做相應的介紹,我們可以將內置函數以外所有的函數稱爲自定義函數

02

** 內置函數 **

內置函數是在 golang 語言中自帶的函數,無需我們聲明可以直接調用使用

golang 語言中一共有 15 個內置函數:分別爲:make,len,cap,delete,append,copy,new,comlex,real,imag,print,println,close,panic,recover

下面我們對上面的前 12 個內置函數分別舉例子介紹,剩餘部分的內置函數待後續相應的章節學到時再進行介紹

1)make:爲切片,映射或者通道 channel 類型分配內存並初始化對象(第四篇中切片和映射的初始化已經使用過)。以切片爲例如下:

結果如下:

解釋:切片在初始化後,自動填充了該數據類型的默認值:int 默認值爲 0,string 默認值爲空字符串,bool 爲 false;

2)len:計算數組、切片、映射或者通道 channel 的長度;cap:計算數組、切片和通道 channel 的容量,不能計算映射的容量;1)例子中已使用了 len 和 cap 函數,我們不再做多餘的介紹

3)delete:刪除映射中對應的鍵值對。在第四篇關於 map 的操作我們有相關介紹,例子如下:

結果如下:

4)append:將數據添加到原切片的末尾。在第四篇中關於切片的操作中我們也做過相應的介紹,例子如下:

示例如下:

結果如下:

注意:a) 當爲 numSlice 增加元素 4 時,由於切片的長度小於數組的長度,而且切片的最後一個元素的下標爲 1,不等於數組的最後一個元素的下標 2,所以對切片增加 4 時,會導致數組 num 的修改變爲 [1,2,4];b) 當切片的長度等於切片容量時,下一次使用 append() 函數添加元素,容量會以 2 倍的方式擴容,所以當增加 5 時切片擴容爲 6;c) 當切片增加 5 時,由於切片長度已經等於數組的長度,所以不會再改變新的數組的元素值;

5)copy:copy(新切片,原切片),將原切片的數據複製到新切片中,當新切片的空間不夠時直接捨棄多餘的數據,返回複製成功的數據個數

結果如下:

解釋:因爲新切片的長度爲 2,所以原切片只能複製成功 2 個元素:1 和 2

結果如下:

7)comlex:生成一個複數;real:返回複數的實部;imag:返回複數的虛部;

結果如下:

8)print:將信息打印到標準輸出,沒有換行;println:將信息打印到標準輸出並換行

結果如下:

9)close:用於關閉通道 channel;panic:用於觸發宕機;recover:用於捕獲 panic 拋出的異常信息;這三個內置函數我們將在之後的相關章節進行介紹

**   函數的使用  **

01

** 固定參數和可變參數的函數使用 **

函數的使用即函數的調用,固定參數和可變參數函數的使用均可以通過函數名直接調用,如前文我們定義的相乘的多個函數,可以直接通過函數名調用使用

結果如下:

固定參數和可變參數的調用都比較簡單,唯一值得注意的是:可變參數的傳遞

如上,在可變參數的傳遞過程中,仍然需要有三個點:...

既然談到了參數的傳遞,我們現在討論一下參數傳遞的過程:參數傳遞分爲值傳遞和引用傳遞。

值傳遞是指將變量的一個副本傳遞給函數,經過函數的操作,變量的原值不發生改變;

引用傳遞是指將變量的地址傳遞給函數,經過函數的操作,變量的原值會發生改變;

其實本質上都是 "值傳遞",只是引用傳遞中傳遞的值爲地址,而地址指向了原變量的值,所以可以修改原變量

所以:

1)對於 int,string,bool 等類型的變量傳遞是值傳遞;

2)對於指針,切片,映射和通道等引用類型的變量傳遞爲引用傳遞

示例:

結果如下:

解釋:可見通過值傳遞只是原變量的副本,並沒有改變原變量的值;通過引用傳遞仍然是一個副本,但是該副本的值爲原變量的地址,所以導致了原變量值的改變;

02

** 匿名函數的使用 **

func (參數列表)(返回參數列表){

**                    函數體 **

}

匿名函數的使用:1)通過在匿名函數後添加()傳入參數直接使用;2)通過將函數複製給變量進行調用使用;

1)通過在匿名函數後添加()傳入參數直接使用;

結果如下:

2)通過將函數複製給變量進行調用使用;

結果如下:

到此關於 Golang 函數的分享就結束了~

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/DSzNkbGHU2KjZShhm47cEA