Go語(yǔ)言中函數(shù)的使用方法詳解
函數(shù)特點(diǎn)
- 函數(shù)可以有多個(gè)返回值。
- 可以將函數(shù)作為參數(shù)傳遞給其他函數(shù)。
- 可以定義匿名函數(shù)。
- 支持閉包。
- 函數(shù)可以有多個(gè)參數(shù)和多個(gè)返回值。
- 可以使用可變參數(shù)。
函數(shù)知識(shí)點(diǎn)
- 函數(shù)調(diào)用:函數(shù)調(diào)用時(shí)需要傳遞函數(shù)定義中要求的參數(shù),并根據(jù)需要接收返回值。
- 匿名函數(shù):匿名函數(shù)沒(méi)有函數(shù)名,可以直接定義并調(diào)用。常用于函數(shù)內(nèi)部作為閉包使用。
- 閉包:閉包是指一個(gè)函數(shù)內(nèi)部定義的函數(shù),它可以訪問(wèn)外部函數(shù)的變量,并將這些變量與函數(shù)綁定,形成一個(gè)閉合的環(huán)境。
- 可變參數(shù):使用
...
表示可變參數(shù),可變參數(shù)必須放在函數(shù)參數(shù)列表的最后面,并且只能有一個(gè)。 - 函數(shù)作為參數(shù):可以將函數(shù)作為參數(shù)傳遞給其他函數(shù),這種函數(shù)稱為高階函數(shù)。常用于函數(shù)式編程中。
- 函數(shù)作為返回值:函數(shù)也可以作為返回值,這種函數(shù)稱為閉包。常用于實(shí)現(xiàn)類似于裝飾器或者切面等功能。
函數(shù)的使用
函數(shù)定義
Go語(yǔ)言中函數(shù)的定義使用 func
關(guān)鍵字,其基本語(yǔ)法格式如下:
func 函數(shù)名(參數(shù)列表) (返回值列表) {
函數(shù)體
}
其中:
函數(shù)名
表示函數(shù)的名稱,遵循標(biāo)識(shí)符的命名規(guī)則,采用駝峰命名法。參數(shù)列表
表示函數(shù)的輸入?yún)?shù),用逗號(hào)分隔,每個(gè)參數(shù)由參數(shù)名和參數(shù)類型組成,如param1 type1, param2 type2
。返回值列表
表示函數(shù)的返回值,用括號(hào)括起來(lái),可以是多個(gè)返回值,如(type1, type2)
。函數(shù)體
表示函數(shù)的具體實(shí)現(xiàn)邏輯。
例如,下面是一個(gè)計(jì)算兩個(gè)整數(shù)之和的函數(shù):
func Add(x, y int) int { return x + y }
上述函數(shù)名為 Add
,有兩個(gè)參數(shù) x
和 y
,類型都為 int
,返回值類型為 int
,函數(shù)體內(nèi)部實(shí)現(xiàn)為將 x
和 y
相加,并將結(jié)果返回。
需要注意的是,Go語(yǔ)言中函數(shù)也可以有多個(gè)返回值,例如:
func Swap(x, y string) (string, string) { return y, x }
上述函數(shù)名為 Swap
,有兩個(gè)參數(shù) x
和 y
,類型都為 string
,返回值類型為兩個(gè) string
類型的值,函數(shù)體內(nèi)部實(shí)現(xiàn)為將 x
和 y
的值互換,并將結(jié)果以 (y, x)
的形式返回。
函數(shù)的參數(shù)
函數(shù)可以有多個(gè)參數(shù),參數(shù)的類型放在參數(shù)名的后面,如果兩個(gè)或多個(gè)連續(xù)的參數(shù)的類型相同,則可以省略類型,例如:
func swap(x, y string) (string, string) { return y, x }
函數(shù)的返回值
函數(shù)可以返回多個(gè)值,這些值用括號(hào)括起來(lái)并用逗號(hào)分隔。例如:
func sum(a int, b int) (int, int) { return a+b, a-b }
可以使用 :=
賦值語(yǔ)句來(lái)調(diào)用函數(shù),并自動(dòng)推斷返回值類型:
a, b := sum(1, 2)
函數(shù)的參數(shù)是值傳遞,在函數(shù)調(diào)用時(shí),傳遞的是實(shí)參的副本。
函數(shù)的變量作用域
函數(shù)中聲明的變量作用域是該函數(shù)內(nèi)部,在函數(shù)外部是不可見(jiàn)的。如果函數(shù)中使用了全局變量,則在函數(shù)中可以直接使用。
函數(shù)的遞歸調(diào)用
函數(shù)可以遞歸調(diào)用,遞歸調(diào)用必須有一個(gè)終止條件。例如:
func factorial(n uint64) (result uint64) { if (n > 0) { result = n * factorial(n-1) return result } return 1 }
函數(shù)的可變參數(shù)
函數(shù)的可變參數(shù)是一個(gè)非常有用的特性,可以接受任意數(shù)量的參數(shù)。在參數(shù)列表的最后一個(gè)參數(shù)之前加上省略號(hào) ...
即可:
func sum(numbers ...int) int { total := 0 for _, number := range numbers { total += number } return total }
函數(shù)的閉包
函數(shù)的閉包是指函數(shù)可以訪問(wèn)其外部作用域中的變量。例如:
func main() { nextInt := intSeq() fmt.Println(nextInt()) fmt.Println(nextInt()) fmt.Println(nextInt()) newInts := intSeq() fmt.Println(newInts()) } func intSeq() func() int { i := 0 return func() int { i += 1 return i } }
以上代碼輸出:
1
2
3
1
函數(shù)的 defer 語(yǔ)句
在Go語(yǔ)言中,函數(shù)的 defer 語(yǔ)句可以在函數(shù)返回時(shí)執(zhí)行一些清理工作,如關(guān)閉文件、解鎖資源等。defer 語(yǔ)句可以被插入到函數(shù)的任意位置,并且可以定義多個(gè) defer 語(yǔ)句。在函數(shù)執(zhí)行時(shí),每個(gè) defer 語(yǔ)句都會(huì)被壓入一個(gè)棧中,等待函數(shù)返回時(shí)逆序執(zhí)行。
下面是一個(gè)使用 defer 語(yǔ)句的例子:
func main() { defer fmt.Println("deferred") fmt.Println("regular") }
這個(gè)程序輸出:
regular
deferred
在這個(gè)例子中,當(dāng) main 函數(shù)執(zhí)行到 defer 語(yǔ)句時(shí),"deferred" 被壓入一個(gè)棧中。然后程序繼續(xù)執(zhí)行,輸出 "regular"。當(dāng)函數(shù)返回時(shí),棧中的 defer 語(yǔ)句被逆序執(zhí)行,最后輸出 "deferred"。
除了可以用來(lái)清理資源,defer 語(yǔ)句還可以用來(lái)記錄函數(shù)的執(zhí)行時(shí)間。下面是一個(gè)例子:
func timeTrack(start time.Time, name string) { elapsed := time.Since(start) log.Printf("%s took %s", name, elapsed) } func myFunc() { defer timeTrack(time.Now(), "myFunc") // 函數(shù)的實(shí)際代碼 }
在這個(gè)例子中,timeTrack 函數(shù)用來(lái)記錄函數(shù)的執(zhí)行時(shí)間。在 myFunc 函數(shù)中,defer 語(yǔ)句被用來(lái)調(diào)用 timeTrack 函數(shù),并傳入當(dāng)前時(shí)間和函數(shù)名作為參數(shù)。當(dāng) myFunc 函數(shù)返回時(shí),timeTrack 函數(shù)被執(zhí)行,輸出函數(shù)的執(zhí)行時(shí)間。
總之,在Go語(yǔ)言中,defer 語(yǔ)句是一個(gè)非常方便的工具,可以用來(lái)清理資源、記錄函數(shù)的執(zhí)行時(shí)間等。
注意
- 命名規(guī)范:函數(shù)名要有意義,采用駝峰命名法,首字母大寫表示函數(shù)是公有的,首字母小寫表示函數(shù)是私有的。
- 參數(shù)傳遞:Go語(yǔ)言函數(shù)的參數(shù)傳遞采用值傳遞,如果需要修改傳入的參數(shù),可以傳遞指針。
- 返回值:Go語(yǔ)言函數(shù)可以返回多個(gè)值,可以定義返回值的變量名,也可以省略變量名,但是建議寫上變量名,方便代碼閱讀。
- 錯(cuò)誤處理:Go語(yǔ)言函數(shù)一般都會(huì)返回一個(gè)error類型的值來(lái)表示函數(shù)執(zhí)行是否成功,需要在函數(shù)調(diào)用的地方進(jìn)行錯(cuò)誤處理。
- 函數(shù)變量:在Go語(yǔ)言中,函數(shù)也可以作為變量使用,可以將函數(shù)賦值給變量,也可以作為參數(shù)傳遞給其他函數(shù)。
- defer語(yǔ)句:defer語(yǔ)句用于在函數(shù)返回前執(zhí)行一些清理操作,例如關(guān)閉文件、釋放鎖等。defer語(yǔ)句的執(zhí)行順序是“后進(jìn)先出”。
以上就是Go語(yǔ)言中函數(shù)的使用方法詳解的詳細(xì)內(nèi)容,更多關(guān)于Go語(yǔ)言函數(shù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Golang?int函數(shù)使用實(shí)例全面教程
這篇文章主要為大家介紹了Golang?int函數(shù)使用實(shí)例全面教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10使用go備份StarRocks建表語(yǔ)句方法實(shí)例
這篇文章主要為大家介紹了使用go備份StarRocks建表語(yǔ)句方法實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12go語(yǔ)言實(shí)現(xiàn)二叉樹(shù)的序例化與反序列化
這篇文章主要介紹了go語(yǔ)言實(shí)現(xiàn)二叉樹(shù)的序例化與反序列化,文章圍繞主題展開(kāi)詳細(xì)內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-05-05如何在Go中使用Casbin進(jìn)行訪問(wèn)控制
這篇文章主要介紹了如何在Go中使用Casbin進(jìn)行訪問(wèn)控制,Casbin是一個(gè)強(qiáng)大的、高效的開(kāi)源訪問(wèn)控制框架,其權(quán)限管理機(jī)制支持多種訪問(wèn)控制模型,Casbin只負(fù)責(zé)訪問(wèn)控制2022-08-08使用自定義錯(cuò)誤碼攔截grpc內(nèi)部狀態(tài)碼問(wèn)題
這篇文章主要介紹了使用自定義錯(cuò)誤碼攔截grpc內(nèi)部狀態(tài)碼問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09詳解Go語(yǔ)言中new和make關(guān)鍵字的區(qū)別
本篇文章來(lái)介紹一道非常常見(jiàn)的面試題,到底有多常見(jiàn)呢?可能很多面試的開(kāi)場(chǎng)白就是由此開(kāi)始的。那就是 new 和 make 這兩個(gè)內(nèi)置函數(shù)的區(qū)別,希望對(duì)大家有所幫助2023-03-03Golang 實(shí)現(xiàn)復(fù)制文件夾同時(shí)復(fù)制文件
這篇文章主要介紹了Golang 實(shí)現(xiàn)復(fù)制文件夾同時(shí)復(fù)制文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12