08.手撕Go語(yǔ)言-函數(shù)

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

定義&調(diào)用

定義

08.01.png

形參列表需要描述參數(shù)名及參數(shù)類型,所有形參為函數(shù)塊局部變量。返回值需要描述返回值類型

舉例:

  1. 無(wú)參&無(wú)返回值
08.02.png
  1. 有參&無(wú)返回值
08.03.png
  1. 有參&有返回值
08.04.png

調(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

08.05.png

參數(shù)

類型合并

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

08.06.png
08.07.png

可變參數(shù)

某些情況下函數(shù)需要處理形參數(shù)量可變,需要運(yùn)算符…聲明可變參數(shù)函數(shù)或在調(diào)用時(shí)傳遞可變參數(shù)

  1. 定義

可變參數(shù)只能定義一個(gè)且只能在參數(shù)列表末端。在調(diào)用函數(shù)后,可變參數(shù)則被初始化為對(duì)應(yīng)類型的切片

08.08.png
08.09.png
  1. 傳遞

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

08.10.png

返回值

在函數(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ù)

08.11.png

命名返回值

在函數(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è)返回值類型名

08.12.png
08.13.png

遞歸

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

例如:

  1. 計(jì)算n階乘
08.14.png
  1. 漢羅塔游戲
08.15.png

函數(shù)類型

函數(shù)也可以賦值給變量,存儲(chǔ)在數(shù)組、切片、映射中,也可作為參數(shù)傳遞給函數(shù)或作為函數(shù)返回值進(jìn)行返回

聲明&初始化&調(diào)用

08.16.png

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

08.17.png
08.18.png

匿名函數(shù)與閉包

匿名函數(shù)

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

08.19.png

閉包

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

08.20.png
08.21.png

值類型&引用類型

值類型和引用類型的差異在于賦值同類型新變量后,對(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ì)值類型可以借助指針修改原值

08.23.png

針對(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ù)外的原變量信息

08.24.png

指針傳遞

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

08.25.png

錯(cuò)誤處理

error接口

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

08.26.png
08.27.png

error接口的初始化方法

  1. 通過(guò)errors包的New方法創(chuàng)建

  2. 通過(guò)fmt.Errorf方法創(chuàng)建

08.28.png

defer

defer關(guān)鍵字用戶聲明函數(shù),不論函數(shù)是否發(fā)生錯(cuò)誤都在函數(shù)執(zhí)行最后執(zhí)行(return之前),若使用defer聲明多個(gè)函數(shù),則按照聲明的順序,先聲明后執(zhí)行(堆)

常用來(lái)做資源釋放,記錄日志等工作

08.29.png

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ò)誤

  1. panic
08.30.png
  1. recover
08.31.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容