4.1 Go語言從入門到精通:函數(shù)
作者:xcbeyond
瘋狂源自夢想,技術(shù)成就輝煌!微信公眾號:《程序猿技術(shù)大咖》號主,專注后端開發(fā)多年,擁有豐富的研發(fā)經(jīng)驗,樂于技術(shù)輸出、分享,現(xiàn)階段從事微服務(wù)架構(gòu)項目的研發(fā)工作,涉及架構(gòu)設(shè)計、技術(shù)選型、業(yè)務(wù)研發(fā)等工作。對于Java、微服務(wù)、數(shù)據(jù)庫、Docker有深入了解,并有大量的調(diào)優(yōu)經(jīng)驗。
常量和變量都是數(shù)據(jù)的一種載體,數(shù)據(jù)通過不同的運算符參與運算時,對計算的流程進(jìn)行一定程度的控制便是流程控制,并且低于較多的數(shù)據(jù)通過內(nèi)置容器進(jìn)行存儲,那么之后要干嘛呢?就是通過以上的所有概念進(jìn)行整合,將其抽象到一個模塊中去完成某一功能,這便是本篇的主題——函數(shù)。
函數(shù),并不是一個新概念,在不同語言中都能聽到函數(shù)這個名詞,那么在Go語言中函數(shù)又該如何使用呢?它到底與其他語言又有哪些差異呢?
1、函數(shù)定義
Go 語言中,函數(shù)定義是以關(guān)鍵字 func 開始,其標(biāo)準(zhǔn)格式如下:
func 函數(shù)名(參數(shù)列表) (返回參數(shù)列表) {
函數(shù)體
}
定義解析:
func:函數(shù)由關(guān)鍵字 func 開始,來表明這是一個函數(shù)。
函數(shù)名:函數(shù)名稱,需符合變量命名規(guī)范,函數(shù)名和參數(shù)列表一起構(gòu)成了函數(shù)簽名。在同一個包內(nèi)不能定義相同的函數(shù)名。(記?。篏o語言中,是不支持函數(shù)重載的?。?
參數(shù)列表:參數(shù)就是一個占位符,當(dāng)函數(shù)被調(diào)用時,你可以將值傳遞給參數(shù),這個值被稱為實際參數(shù)。參數(shù)列表指定的是參數(shù)類型、順序、及參數(shù)個數(shù)。參數(shù)是可選的,也就是說函數(shù)也可以不包含參數(shù)。
返回類型:函數(shù)返回一列值的數(shù)據(jù)類型。有時是不需要返回值的,此時返回類型可以沒有。
函數(shù)體:函數(shù)定義的代碼集合,用來實現(xiàn)具體的函數(shù)邏輯。
根據(jù)函數(shù)參數(shù)情況可分為三類,接下來展開具體說明。
固定參數(shù)
可變參數(shù)
固定參數(shù)和可變參數(shù)
1.1 固定參數(shù)的函數(shù)定義
函數(shù)定義格式如下:
func 函數(shù)名(參數(shù)列表) (返回參數(shù)列表) {
函數(shù)體
}
例如,兩數(shù)相乘:
func multipleForTowNum(num1 int, num2 int) int {
result := num1 * num2
return result
}
1.2 可變參數(shù)的函數(shù)定義
Go 語言中還支持另外一種可變參數(shù)的函數(shù),其函數(shù)定義格式如下:
func 函數(shù)名(v…T) (返回參數(shù)列表) {
函數(shù)體
}
注:v…T 表明 v 為一個切片,T 為切片中數(shù)據(jù)的類型。
例如,實現(xiàn)多數(shù)相乘:
func multipleForNums(nums …int) int {
var result int = 1
for _, num := range nums {
result = result * num
}
return result
}
其中,nums為切片,用來存放不定長度的int類型數(shù)組。
1.3 固定參數(shù)和可變參數(shù)的函數(shù)定義
上面介紹了固定參數(shù)、可變參數(shù)的定義,如果存在固定參數(shù)和可變參數(shù)共存的情況,該如何定義呢?
其格式如下:
func 函數(shù)名(固定參數(shù)列表, v…T) (返回參數(shù)列表) {
函數(shù)體
}
例如,在兩數(shù)相加基礎(chǔ)上,再進(jìn)行多數(shù)的相乘:
func multipleForTowNums(num1 int, num2 int, nums …int) int {
result := num1 + num2
for _, num := range nums {
result = result * num
}
return result
}
2、函數(shù)分類
函數(shù)從大的方面分類兩類:自定義函數(shù)、內(nèi)置函數(shù)。
2.1 自定義函數(shù)
比如,上一小節(jié)【函數(shù)定義】中的舉例函數(shù)都屬于自定義函數(shù),根據(jù)實際需求以關(guān)鍵字 func 開頭的函數(shù)。另一方面,自定義函數(shù)是相對Go 語言內(nèi)置函數(shù)而言,指內(nèi)置函數(shù)以外的函數(shù)。
2.2 內(nèi)置函數(shù)
內(nèi)置函數(shù),是指在使用時無需導(dǎo)入包而直接使用的函數(shù),如 len、append等。在 Go 語言一共有15個內(nèi)置函數(shù),如下所示:
3、函數(shù)返回值
在1、函數(shù)定義中我們知道函數(shù)在使用調(diào)用時,通常會給調(diào)用者返回一個結(jié)果,這個結(jié)果被稱為函數(shù)的返回值。
一個函數(shù)可以沒有返回值,也可以有一個或多個返回值。
3.1 多返回值
例如,將兩個數(shù)進(jìn)行交換,并返回交換后的兩數(shù):
func swap(x, y string) (string, string) {
return y, x
}
3.2 空白標(biāo)識符
_ 是 Go 中的空白標(biāo)識符。它可以代替任何類型的任何值,用處十分廣泛。例如,當(dāng)我們在調(diào)用一個多返回值的函數(shù)時,但只會用到其中一部分返回值而又不想憑空多聲明多余變量,此時,空白標(biāo)識符就發(fā)揮它的優(yōu)勢了。
例如,上面的兩個數(shù)交換函數(shù) swap:
package main
import “fmt”
func main() {
x, _ := swap(1, 5)
fmt.Println(x) // 輸出:5
}
func swap(x, y int) (int, int) {
return y, x
}
4、函數(shù)使用
接下來,以一個簡單示例來說明如何正確的使用函數(shù)。
如下所示是一個計算兩數(shù)最大值的函數(shù) max。
package main
import “fmt”
func main() {
fmt.Print(max(10, 7))
}
// 獲取兩數(shù)的最大值
func max(num1, num2 int) int {
if num1 > num2 {
return num1
} else {
return num2
}
}