如何理解Go函數(shù)是一等公民原理及使用場(chǎng)景
引言
在接觸Go這么語(yǔ)言,可能你經(jīng)常會(huì)聽(tīng)到這樣一句話。Go語(yǔ)言中,函數(shù)屬于一等公民,你可能很費(fèi)解,什么是一等公民。是因?yàn)楹瘮?shù)的優(yōu)先級(jí)很高嗎?如果是又是怎樣的優(yōu)先級(jí)呢?本文將分享Go語(yǔ)言中函數(shù)是一等公民的真正面紗。
什么是函數(shù)
在了解一等公民之前,先普及一下函數(shù)基礎(chǔ)知識(shí)。函數(shù)是執(zhí)行某種特定功能的代碼塊,一個(gè)較大的程序一般應(yīng)分為若干個(gè)程序塊,每一個(gè)模塊用來(lái)實(shí)現(xiàn)一個(gè)特定的功能,這里的模塊就可以稱之為函數(shù)。
//?函數(shù)的定義 func?FunName(變量名?變量類(lèi)型...)?(返回類(lèi)型...)?{ ????return?返回值... }
在Go語(yǔ)言中,函數(shù)可以分配給一個(gè)變量,可以作為函數(shù)的參數(shù),也可以作為函數(shù)的返回值。這樣的行為就可以理解為函數(shù)屬于一等公民。
函數(shù)使用場(chǎng)景
匿名函數(shù)
通過(guò)匿名函數(shù)的形式,將一個(gè)函數(shù)分配給一個(gè)變量。
package?main import?(?? ????"fmt" ) func?main()?{?? ????a?:=?func()?{ ????????fmt.Println("hello?world?first?class?function") ????} ????a() ????fmt.Printf("%T",?a) }
在上面的程序中,我們?yōu)榈?8 行中的變量分配了一個(gè)函數(shù)。這是將函數(shù)分配給變量的語(yǔ)法。如果您仔細(xì)注意,分配給的函數(shù)沒(méi)有名稱。這些類(lèi)型的函數(shù)稱為匿名函數(shù),因?yàn)樗鼈儧](méi)有名稱。
也可以調(diào)用匿名函數(shù)而不將其分配給變量。讓我們?cè)谙旅娴氖纠锌纯催@是如何完成的。
package?main import?(?? ????"fmt" ) func?main()?{?? ????func()?{ ????????fmt.Println("hello?world?first?class?function") ????}() }
在上面的程序中,在第 8 行中定義了一個(gè)匿名函數(shù),緊接著函數(shù)定義之后,我們使用第10行("()")調(diào)用該函數(shù)。
自定義函數(shù)類(lèi)型
就像我們定義自己的結(jié)構(gòu)類(lèi)型一樣,也可以定義自己的函數(shù)類(lèi)型。
type?add?func(a?int,?b?int)?int
上面的代碼片段創(chuàng)建了一個(gè)新的函數(shù)類(lèi)型,它接受兩個(gè)整數(shù)參數(shù)并返回一個(gè)整數(shù)?,F(xiàn)在我們可以定義類(lèi)型的變量。
package?main import?(?? ????"fmt" ) type?add?func(a?int,?b?int)?int func?main()?{?? ????var?a?add?=?func(a?int,?b?int)?int?{ ????????return?a?+?b ????} ????s?:=?a(5,?6) ????fmt.Println("Sum",?s) }
在上面的程序中,在第 10 行,我們定義了一個(gè)變量 type,并為其賦值一個(gè)簽名與類(lèi)型匹配的函數(shù)。我們調(diào)用第 13 行中的函數(shù)并將結(jié)果分配給s變量。將打印結(jié)果:
Sum 11
函數(shù)作為參數(shù)
在Go語(yǔ)言中,也是支持將函數(shù)作為另外一個(gè)函數(shù)的參數(shù)進(jìn)行傳遞。
package?main import?(?? ????"fmt" ) func?simple(a?func(a,?b?int)?int)?{?? ????fmt.Println(a(60,?7)) } func?main()?{?? ????f?:=?func(a,?b?int)?int?{ ????????return?a?+?b ????} ????simple(f) }
在上面的示例中,在第 7 行中,我們定義了一個(gè)函數(shù),該函數(shù)接受一個(gè)接受兩個(gè) int 參數(shù)并返回一個(gè) int 作為參數(shù)的函數(shù)。在第 12 行的 main 函數(shù)中,我們創(chuàng)建了一個(gè)匿名函數(shù),其簽名與函數(shù)的參數(shù)匹配。我們?cè)谙乱恍兄姓{(diào)用 and 傳遞作為參數(shù)。
函數(shù)作為返回值
在Go語(yǔ)言中,也可以將函數(shù)作為另外一個(gè)函數(shù)的返回值進(jìn)行傳遞。
package?main import?(?? ????"fmt" ) func?simple()?func(a,?b?int)?int?{?? ????f?:=?func(a,?b?int)?int?{ ????????return?a?+?b ????} ????return?f } func?main()?{?? ????s?:=?simple() ????fmt.Println(s(60,?7)) }
在上面的程序中,第 7 行中的簡(jiǎn)單函數(shù)返回一個(gè)函數(shù),該函數(shù)接受兩個(gè)參數(shù)并返回。
閉包
閉包是匿名函數(shù)的特例。閉包是匿名函數(shù),用于訪問(wèn)在函數(shù)主體外部定義的變量。
package?main import?(?? ????"fmt" ) func?main()?{?? ????a?:=?5 ????func()?{ ????????fmt.Println("a?=",?a) ????}() }
在上面的程序中,匿名函數(shù)訪問(wèn)變量,該變量存在于其主體之外的第 10 行。因此,這個(gè)匿名函數(shù)是一個(gè)閉包。
實(shí)戰(zhàn)演示
上面提到了一些函數(shù)相關(guān)的知識(shí),這里以函數(shù)作為形參演示一個(gè)demo。
將函數(shù)作為參數(shù),將數(shù)組中的每一個(gè)元素都 * 5。
package?main import?"fmt" func?sum(array?[3]int,?f?func(int)int)?[3]int?{ ????newArray?:=?[3]int{0,?0,?0} ????for?k,?v?:=?range?array?{ ????????newArray[k]?=?f(v) ????} ????return?newAarray } func?main()?{ ????a?:=?[3]int{1,?2,?3} ????sum(a,?func(n?int)?int?{ ????????return?n?*?5 ????}) }
以上就是如何理解Go函數(shù)是一等公民原理及使用場(chǎng)景的詳細(xì)內(nèi)容,更多關(guān)于Go函數(shù)一等公民的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Golang多個(gè)域名的跨域資源共享的實(shí)現(xiàn)
本文主要介紹了Golang多個(gè)域名的跨域資源共享的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-02-02適合PHP同學(xué)的GoFrame框架使用體驗(yàn)及學(xué)習(xí)建議
這篇文章主要為大家介紹了非常適合PHP同學(xué)使用的GoFrame框架設(shè)計(jì)思想使用體驗(yàn)及學(xué)習(xí)建議介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06golang 輸出重定向:fmt Log,子進(jìn)程Log,第三方庫(kù)logrus的詳解
這篇文章主要介紹了golang 輸出重定向:fmt Log,子進(jìn)程Log,第三方庫(kù)logrus的詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12詳解Golang中errors包如何返回自定義error類(lèi)型
這篇文章主要為大家詳細(xì)介紹了Golang中errors包如何返回自定義error類(lèi)型,文中的示例代碼簡(jiǎn)潔易懂,有需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-09-09