Go語(yǔ)言入門之函數(shù)的定義與使用
1.前言
函數(shù)是一段代碼的片段,包含連續(xù)的執(zhí)行語(yǔ)句,它可以將零個(gè)或多個(gè)輸入?yún)?shù)映射到零個(gè)或多個(gè)參數(shù)輸出。函數(shù)像一個(gè)黑盒,對(duì)它的使用者隱藏實(shí)現(xiàn)細(xì)節(jié)。還可以在代碼中通過函數(shù)調(diào)用來執(zhí)行它們。
學(xué)到現(xiàn)在,我們使用的 Go 函數(shù)只有 main
函數(shù):
func main() { }
2.函數(shù)聲明
每個(gè)函數(shù)都包含 func
關(guān)鍵字、函數(shù)名、輸入?yún)?shù)列表、一個(gè)可選的返回列表以及函數(shù)體
func name(parameter-list) (result-list) { function body }
func
關(guān)鍵字:Go 語(yǔ)言使用func
關(guān)鍵字來聲明一個(gè)函數(shù)。類似 Python 的def
關(guān)鍵字。- 函數(shù)名:緊跟
func
關(guān)鍵字后的事函數(shù)名稱,函數(shù)名必須是一個(gè)標(biāo)識(shí)符,即不能跟 Go 語(yǔ)言關(guān)鍵字沖突 - 輸入?yún)?shù)列表(形參列表):輸入?yún)?shù)聲明列表必須用一對(duì)小括號(hào)括起來,指定一組變量的參數(shù)名和參數(shù)類型,這些局部變量都由調(diào)用者提供的實(shí)參傳遞而來。
- 輸出結(jié)果列表(返回列表):指定了函數(shù)返回值的類型。當(dāng)函數(shù)返回一個(gè)未命名的返回值或者沒有返回值的時(shí)候,返回列表的圓括號(hào)可以省略。在 Go 中,一個(gè)函數(shù)可以有多個(gè)返回值。
- 函數(shù)體:函數(shù)體必須用一對(duì)大括號(hào)括起來。一對(duì)大括號(hào)和它其間的代碼形成了一個(gè)顯式代碼塊。在一個(gè)函數(shù)體內(nèi),
return
關(guān)鍵字可以用來結(jié)束此函數(shù)的正常執(zhí)行流程并進(jìn)入此函數(shù)的退出階段。
2.1 函數(shù)例子
接下來,看一個(gè)簡(jiǎn)單的 Go 整數(shù)計(jì)算器的 加、減、乘、除 函數(shù)的例子。
package main import "fmt" func add(num1 int, num2 int) (num3 int) { num3 = num1 + num2 return } func subtract(num1 int, num2 int) int { num3 := num1 - num2 return num3 } func multiply(num1 int, num2 int) int { result := num1 * num2 return result } func divide(num1 int, num2 int) (result int) { if num2 != 0 { result = num1 / num2 } else { panic("division by zero") } return result } func main() { fmt.Printf("2021 + 19 = %d\n", add(2021, 19)) fmt.Printf("2021 - 19 = %d\n", subtract(2021, 19)) fmt.Printf("2021 * 19 = %d\n", multiply(2021, 19)) fmt.Printf("2021 / 19 = %d\n", divide(2021, 19)) // fmt.Printf("2021 / 0 = %d\n", divide(2021, 0)) }
結(jié)果為:
2021 + 19 = 2040
2021 - 19 = 2002
2021 * 19 = 38399
2021 / 19 = 106
如果我們除以 0 的話,調(diào)用了一個(gè)叫做 panic
的內(nèi)置函數(shù),該函數(shù)會(huì)導(dǎo)致一個(gè)運(yùn)行時(shí)的錯(cuò)誤。還會(huì)得到一個(gè)異常,異常也會(huì)在接下來的博客中學(xué)習(xí)到。
panic: division by zero goroutine 1 [running]: main.divide(...) ...
2.2 Go 函數(shù)支持多返回值
Go 支持一個(gè)函數(shù)返回多個(gè)值:
func f() (int, int){ return 2014, 2021 } func main() { x, y := f() }
這里需要做三個(gè)改變:
- 返回類型改變:多個(gè)返回類型用多個(gè)逗號(hào)
,
分隔的類型, - 改變
return
后的表達(dá)式:使其包含多個(gè)逗號(hào),
的表達(dá)式, - 最后改變賦值語(yǔ)句,使多個(gè)值都在
:=
或=
的左邊
多個(gè)返回值一般用于返回 error,例如 (x, err := f())
, 或者返回一個(gè)布爾值表示成功,如 (x, ok := f())
.
2.3 變量函數(shù)
對(duì)于 Go 函數(shù)中的最后一個(gè)參數(shù),有一種特殊的形式可以使用:
func add(args ...int) int { total := 0 for _, v := range args { total += v } return total } func main() { fmt.Println(add(1,2,3)) }
通過在最后一個(gè)參數(shù)的類型名稱前使用 ...
,你可以表示它需要零個(gè)或多個(gè)這些 參數(shù)。在這種情況下,我們需要零個(gè)或多個(gè)整數(shù)。我們像其他函數(shù)一樣調(diào)用該函數(shù),而且可以傳遞我們想要的任何數(shù)量的變量。
這正是 fmt.Println
函數(shù)的實(shí)現(xiàn)方式:
func Println(a ...interface{}) (n int, err error)
Println()
函數(shù)可以接受任何數(shù)量的任何類型的值。我們也可以通過在 slice 后面加上 ...
來傳遞一個(gè) ints
的 slice 。
func main() { s1 := []int{1,2,3} fmt.Println(add(s1...)) }
2.4 閉包
可以在函數(shù)內(nèi)部創(chuàng)建函數(shù)。
func main() { add := func(x, y int) int { return x + y } fmt.Println(add(1,1)) }
add
是一個(gè)局部變量,其類型為 func(int, int) int
(一個(gè)函數(shù)接收兩個(gè) int 參數(shù),并返回一個(gè) int 參數(shù))。當(dāng)你創(chuàng)建一個(gè)像這樣的局部函數(shù)時(shí),它還可以訪問其他局部變量。
2.5 遞歸
最后,一個(gè)函數(shù)能夠調(diào)用自己。下面是一種方法來計(jì)算一個(gè)數(shù)字的階乘。
package main import "fmt" func factorial(x uint) uint { if x == 0 { return 1 } return x * factorial(x-1) } func main() { fmt.Println(factorial(4)) }
閉包和遞歸是強(qiáng)大的編程技術(shù),它構(gòu)成了被稱為函數(shù)式編程的范式的基礎(chǔ)。大多數(shù)人都會(huì)發(fā)現(xiàn)函數(shù)式編程比以下方法更難理解:for 循環(huán)、if 語(yǔ)句、變量和簡(jiǎn)單函數(shù)的方法。
3.總結(jié)
- 聲明函數(shù)需要提供函數(shù)名、形參列表和返回值列表
- 名稱中首字母大寫的函數(shù)和類型將被導(dǎo)出并為其他包所用
- 函數(shù)聲明中的每個(gè)形參和返回值都由名字后跟類型組成,如果多個(gè)形參或者返回值具有相同的類型,那么類型只需要給出一次即可。
- 函數(shù)聲明中的返回值也可以省略名字,而只給出類型
- 調(diào)用函數(shù)時(shí)需要根據(jù)其接受的形參給予相應(yīng)的實(shí)參,至于函數(shù)的執(zhí)行結(jié)果則會(huì)通過關(guān)鍵字
return
返回給調(diào)用者。
以上就是Go語(yǔ)言入門之函數(shù)的定義與使用的詳細(xì)內(nèi)容,更多關(guān)于Go語(yǔ)言 函數(shù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
淺談Golang數(shù)據(jù)競(jìng)態(tài)
本文主要介紹了淺談Golang數(shù)據(jù)競(jìng)態(tài),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02Go?語(yǔ)言數(shù)據(jù)結(jié)構(gòu)如何實(shí)現(xiàn)抄一個(gè)list示例詳解
這篇文章主要為大家介紹了Go?語(yǔ)言數(shù)據(jù)結(jié)構(gòu)如何實(shí)現(xiàn)抄一個(gè)list示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04Go項(xiàng)目中添加生成時(shí)間與版本信息的方法
本文主要介紹了Go項(xiàng)目中添加生成時(shí)間與版本信息的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04golang gorm 結(jié)構(gòu)體的表字段缺省值設(shè)置方式
這篇文章主要介紹了golang gorm 結(jié)構(gòu)體的表字段缺省值設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12golang 檢查網(wǎng)絡(luò)狀態(tài)是否正常的方法
今天小編就為大家分享一篇golang 檢查網(wǎng)絡(luò)狀態(tài)是否正常的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-07-07Golang?Fasthttp選擇使用slice而非map?存儲(chǔ)請(qǐng)求數(shù)據(jù)原理探索
本文將從簡(jiǎn)單到復(fù)雜,逐步剖析為什么?Fasthttp?選擇使用?slice?而非?map,并通過代碼示例解釋這一選擇背后高性能的原因,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-02-02