函數(shù)包含函數(shù)名、行參列表、函數(shù)體和返回值列表,使用func進(jìn)行聲明,函數(shù)無(wú)參數(shù)或返回值時(shí)則形參列表和返回值列表省略
定義&調(diào)用
定義

形參列表需要描述參數(shù)名及參數(shù)類型,所有形參為函數(shù)塊局部變量。返回值需要描述返回值類型
舉例:
- 無(wú)參&無(wú)返回值

- 有參&無(wú)返回值

- 有參&有返回值

調(diào)用
函數(shù)通過(guò)函數(shù)名(實(shí)參列表),在調(diào)用過(guò)程中實(shí)參的每個(gè)數(shù)據(jù)會(huì)賦值給形參中的每個(gè)變量,因此實(shí)參列表類型和數(shù)量需要函數(shù)定義的形參一一對(duì)應(yīng)。針對(duì)函數(shù)返回值可通過(guò)變量賦值的方式接收s

參數(shù)
類型合并
在聲明函數(shù)中若存在多個(gè)連續(xù)形參類型相同可只保留最后一個(gè)參數(shù)類型名


可變參數(shù)
某些情況下函數(shù)需要處理形參數(shù)量可變,需要運(yùn)算符…聲明可變參數(shù)函數(shù)或在調(diào)用時(shí)傳遞可變參數(shù)
- 定義
可變參數(shù)只能定義一個(gè)且只能在參數(shù)列表末端。在調(diào)用函數(shù)后,可變參數(shù)則被初始化為對(duì)應(yīng)類型的切片


- 傳遞
在調(diào)用函數(shù)時(shí),也可以使用運(yùn)算符…將切片解包傳遞到可變參數(shù)函數(shù)中

返回值
在函數(shù)提中可以使用return關(guān)鍵字為函數(shù)調(diào)用這提供函數(shù)計(jì)算結(jié)果
多返回值
go語(yǔ)言支持函數(shù)有多個(gè)返回值,在聲明函數(shù)時(shí)使用括號(hào)包含所有返回值類型,并使用return返回對(duì)應(yīng)數(shù)量的用逗號(hào)分割數(shù)據(jù)

命名返回值
在函數(shù)返回值列表中可指定變量名,變量在調(diào)用時(shí)會(huì)根據(jù)類型使用零值進(jìn)行初始化,在函數(shù)體中可進(jìn)行賦值,同時(shí)在調(diào)用return時(shí)不需要添加返回值,go語(yǔ)言自動(dòng)將變量的最終結(jié)果進(jìn)行返回
在使用命名返回值時(shí),當(dāng)聲明函數(shù)中存在若多個(gè)連續(xù)返回值類型相同可只保留最后一個(gè)返回值類型名


遞歸
遞歸是指函數(shù)直接或間接調(diào)用自己,遞歸常用于解決分治問(wèn)題,將大問(wèn)題分解為相同的小問(wèn)題進(jìn)行解決,需要關(guān)注終止條件
例如:
- 計(jì)算n階乘

- 漢羅塔游戲

函數(shù)類型
函數(shù)也可以賦值給變量,存儲(chǔ)在數(shù)組、切片、映射中,也可作為參數(shù)傳遞給函數(shù)或作為函數(shù)返回值進(jìn)行返回
聲明&初始化&調(diào)用

聲明&調(diào)用參數(shù)類型為函數(shù)的函數(shù)


匿名函數(shù)與閉包
匿名函數(shù)
不需要定義名字的函數(shù)叫做匿名函數(shù),常用做幫助函數(shù)在局部代碼塊中使用或作為其他函數(shù)的參數(shù)

閉包
匿名函數(shù)有叫閉包,是指在函數(shù)內(nèi)定義的匿名函數(shù)引用外部函數(shù)的變量,只要匿名函數(shù)繼續(xù)使用則外部函數(shù)賦值的變量不被自動(dòng)銷毀


值類型&引用類型
值類型和引用類型的差異在于賦值同類型新變量后,對(duì)新變量進(jìn)行修改是否能夠影響原來(lái)的變量,若不能影響則為值類型,若能影響則為引用類型
![08.22.png]](https://upload-images.jianshu.io/upload_images/692735-b544604dcabae7a1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
- 值類型:數(shù)值、布爾、字符串、指針、數(shù)組、結(jié)構(gòu)體等
- 引用類型:切片、映射、接口等
針對(duì)值類型可以借助指針修改原值

針對(duì)值類型和引用類型在賦值后新舊變量的地址并不相同,只是引用類型在底層共享數(shù)據(jù)結(jié)構(gòu)(其中包含指針類型元素)
值傳遞
值傳遞
在Go語(yǔ)言中參數(shù)傳遞默認(rèn)均為值傳遞(形參為實(shí)參變量的副本),對(duì)于引用類型數(shù)據(jù)因其底層共享數(shù)據(jù)結(jié)構(gòu),所以在函數(shù)內(nèi)可對(duì)引用類型數(shù)據(jù)修改從而影響函數(shù)外的原變量信息

指針傳遞
可以通過(guò)將變量的地址通過(guò)指類型遞給函數(shù),此時(shí)可通過(guò)指針對(duì)函數(shù)外的原變量進(jìn)行修改

錯(cuò)誤處理
error接口
Go語(yǔ)言通過(guò)error接口實(shí)現(xiàn)錯(cuò)誤處理的標(biāo)準(zhǔn)模式,通過(guò)使用函數(shù)返回值列表中的最后一個(gè)值返回錯(cuò)誤信息,將錯(cuò)誤的處理交由程序員主動(dòng)進(jìn)行處理


error接口的初始化方法
通過(guò)errors包的New方法創(chuàng)建
通過(guò)fmt.Errorf方法創(chuàng)建

defer
defer關(guān)鍵字用戶聲明函數(shù),不論函數(shù)是否發(fā)生錯(cuò)誤都在函數(shù)執(zhí)行最后執(zhí)行(return之前),若使用defer聲明多個(gè)函數(shù),則按照聲明的順序,先聲明后執(zhí)行(堆)
常用來(lái)做資源釋放,記錄日志等工作

panic與recover函數(shù)
go語(yǔ)言提供panic和recover函數(shù)用于處理運(yùn)行時(shí)錯(cuò)誤,當(dāng)調(diào)用panic拋出錯(cuò)誤,中斷原有的控制流程,常用于不可修復(fù)性錯(cuò)誤。recover函數(shù)用于終止錯(cuò)誤處理流程,僅在defer語(yǔ)句的函數(shù)中有效,用于截取錯(cuò)誤處理流程,recover只能捕獲到最后一個(gè)錯(cuò)誤
- panic

- recover
