Go函數(shù)

函數(shù)不但可以用于封裝數(shù)據(jù)、分割功能、解耦邏輯,還可以化身為普通的值,在其他函數(shù)間傳遞、賦予變量、做類(lèi)型判斷和轉(zhuǎn)換等。

函數(shù)值可以成為被隨意傳播的獨(dú)立邏輯組件(功能模塊)。

函數(shù)定義

函數(shù)的基本組成為:關(guān)鍵字func、函數(shù)名、參數(shù)列表、返回值列表、函數(shù)體、返回語(yǔ)句

func function_name( [parameter list] ) [return_types] {
   函數(shù)體
}

func Add(a,b int) (res int, err error){
    if a < 0 || b < 0 {
        err = errors.New("數(shù)值不能小于0")
        return
    }
    res = a+b
    return
}

不管傳遞的是指針、引用還是其它類(lèi)型參數(shù),都是值拷貝傳遞的,區(qū)別在于拷貝的目標(biāo)是目標(biāo)對(duì)象還是拷貝指針而已。

在函數(shù)調(diào)用之前,編譯器會(huì)為形參和返回值分配內(nèi)存空間,并將實(shí)參拷貝到形參內(nèi)存。

函數(shù)的簽名

參數(shù)

參數(shù)列表中,若相鄰變量類(lèi)型一致可以合寫(xiě)。
如下面例子,二者等價(jià)

func Add(a int, b int) int {}
func Add(a,b int) int {}

不定參數(shù)

不定參數(shù)是指函數(shù)傳入的參數(shù)個(gè)數(shù)為不定數(shù)量。且必須是最后一個(gè)參數(shù)。

args ...type的形式來(lái)表示不定參數(shù),它是一個(gè)語(yǔ)法糖,即這種語(yǔ)法對(duì)語(yǔ)言的功能沒(méi)有影響,但方便程序員使用。

下例展示了類(lèi)型為int的不定參數(shù)的使用

func myfunc(args ...int) {
    for _, arg := range args {
        fmt.Println(arg)
    }
}
//myfunc(1,2,5,7) 調(diào)用
//myfunc(3,4,7,2,4,6) 調(diào)用

如果想傳遞任意類(lèi)型的參數(shù),可以使用 args ...interface{}
如Go語(yǔ)言標(biāo)準(zhǔn)庫(kù)中fmt.Printf()的函數(shù)原型

func Printf(format string, args ...interface{}) {}

返回值

返回值列表中,如果只有一個(gè)返回值,返回值類(lèi)型可以不加括號(hào),如

func Add(a,b int) int {}

多返回值

Go語(yǔ)言的函數(shù)或者成員方法可以有多個(gè)返回值!其他語(yǔ)言只能有一個(gè)返回值

返回值列表中,如果有多個(gè)返回值,return語(yǔ)句必須符合返回值列表類(lèi)型的順序

func Add(a,b int, c string) (int, string) {
    x := a+b //int類(lèi)型
    y := c//string類(lèi)型
    return x,y //x y的順序要對(duì),反過(guò)來(lái)就會(huì)報(bào)錯(cuò)
}

返回值列表中,除了寫(xiě)返回值的類(lèi)型外,也可以直接指明返回值名稱(chēng),這樣就不用在函數(shù)體里聲明返回值的名稱(chēng)了(直接用返回值列表中聲明的名稱(chēng)),而且return句也可以省略return的內(nèi)容(自動(dòng)匹配返回值列表中的內(nèi)容)。這時(shí),即使只有一個(gè)返回值也要加括號(hào)

func Add(a,b int) (res int, err error) {
    res = a+b //不用先聲明res了,返回值列表中聲明過(guò)了
    return //等價(jià)于return res,err
}

上面寫(xiě)法也可以用下面的替代

func Add(a,b int) (res int, err error) {
    return a+b,err
}

跳過(guò)返回值

如果調(diào)用了一個(gè)多返回值的函數(shù)或方法,但不想關(guān)心其中的某個(gè)返回值,可以用一個(gè)下劃線_來(lái)跳過(guò)該返回值。
如調(diào)用者在讀文件時(shí)不想關(guān)心Read()函數(shù)返回的錯(cuò)誤碼

n, _ := f.Read(buf)

函數(shù)的調(diào)用

函數(shù)調(diào)用很簡(jiǎn)單,只要在函數(shù)名后加小括號(hào)即可。

Add(1,2)

匿名函數(shù)只要在函數(shù)后面加小括號(hào)即可自調(diào)用

func (a,b int) int {
    return a+b
}(1,2)

匿名函數(shù)與閉包

匿名函數(shù)

匿名函數(shù)顧名思義,就是沒(méi)有函數(shù)名的函數(shù)。

func (a,b int) int {
    return a+b
}

匿名函數(shù)可以直接賦值給一個(gè)變量

f := func (a,b int) int {
    return a+b
}

或者自調(diào)用

func (a,b int) int {
    return a+b
}(1,2)

閉包

引用了自由變量的匿名函數(shù)就是一個(gè)閉包函數(shù)。
閉包體現(xiàn)的是由不確定到確定的一個(gè)過(guò)程。它的內(nèi)部邏輯并不是完整的,由一部分邏輯需要這個(gè)自由變量參與完成。

閉包函數(shù)的意義:由于自由變量只由當(dāng)被調(diào)用的時(shí)候才確定,所以,閉包函數(shù)的部分邏輯是動(dòng)態(tài)生成的,可以借此才程序運(yùn)行的過(guò)程中,根據(jù)需要生成功能不同的函數(shù),繼而影響后續(xù)程序的行為。

高階函數(shù)

內(nèi)置函數(shù)

go 內(nèi)置函數(shù)

GO語(yǔ)言內(nèi)置函數(shù)(有圖)

?著作權(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)容