最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何理解Go函數(shù)是一等公民原理及使用場景

 更新時(shí)間:2023年07月25日 15:20:49   作者:kert  
這篇文章主要為大家介紹了如何理解Go函數(shù)是一等公民及使用場景詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

在接觸Go這么語言,可能你經(jīng)常會(huì)聽到這樣一句話。Go語言中,函數(shù)屬于一等公民,你可能很費(fèi)解,什么是一等公民。是因?yàn)楹瘮?shù)的優(yōu)先級很高嗎?如果是又是怎樣的優(yōu)先級呢?本文將分享Go語言中函數(shù)是一等公民的真正面紗。

什么是函數(shù)

在了解一等公民之前,先普及一下函數(shù)基礎(chǔ)知識。函數(shù)是執(zhí)行某種特定功能的代碼塊,一個(gè)較大的程序一般應(yīng)分為若干個(gè)程序塊,每一個(gè)模塊用來實(shí)現(xiàn)一個(gè)特定的功能,這里的模塊就可以稱之為函數(shù)。

//?函數(shù)的定義
func?FunName(變量名?變量類型...)?(返回類型...)?{
????return?返回值...
}

在Go語言中,函數(shù)可以分配給一個(gè)變量,可以作為函數(shù)的參數(shù),也可以作為函數(shù)的返回值。這樣的行為就可以理解為函數(shù)屬于一等公民。

函數(shù)使用場景

匿名函數(shù)

通過匿名函數(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ù)分配給變量的語法。如果您仔細(xì)注意,分配給的函數(shù)沒有名稱。這些類型的函數(shù)稱為匿名函數(shù),因?yàn)樗鼈儧]有名稱。

也可以調(diào)用匿名函數(shù)而不將其分配給變量。讓我們在下面的示例中看看這是如何完成的。

package?main
import?(??
????"fmt"
)
func?main()?{??
????func()?{
????????fmt.Println("hello?world?first?class?function")
????}()
}

在上面的程序中,在第 8 行中定義了一個(gè)匿名函數(shù),緊接著函數(shù)定義之后,我們使用第10行("()")調(diào)用該函數(shù)。

自定義函數(shù)類型

就像我們定義自己的結(jié)構(gòu)類型一樣,也可以定義自己的函數(shù)類型。

type?add?func(a?int,?b?int)?int

上面的代碼片段創(chuàng)建了一個(gè)新的函數(shù)類型,它接受兩個(gè)整數(shù)參數(shù)并返回一個(gè)整數(shù)。現(xiàn)在我們可以定義類型的變量。

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è)簽名與類型匹配的函數(shù)。我們調(diào)用第 13 行中的函數(shù)并將結(jié)果分配給s變量。將打印結(jié)果:

Sum 11

函數(shù)作為參數(shù)

在Go語言中,也是支持將函數(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ù)匹配。我們在下一行中調(diào)用 and 傳遞作為參數(shù)。

函數(shù)作為返回值

在Go語言中,也可以將函數(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 行中的簡單函數(shù)返回一個(gè)函數(shù),該函數(shù)接受兩個(gè)參數(shù)并返回。

閉包

閉包是匿名函數(shù)的特例。閉包是匿名函數(shù),用于訪問在函數(shù)主體外部定義的變量。

package?main
import?(??
????"fmt"
)
func?main()?{??
????a?:=?5
????func()?{
????????fmt.Println("a?=",?a)
????}()
}

在上面的程序中,匿名函數(shù)訪問變量,該變量存在于其主體之外的第 10 行。因此,這個(gè)匿名函數(shù)是一個(gè)閉包。

實(shí)戰(zhàn)演示

上面提到了一些函數(shù)相關(guān)的知識,這里以函數(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ù)是一等公民原理及使用場景的詳細(xì)內(nèi)容,更多關(guān)于Go函數(shù)一等公民的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • go程序部署到linux上運(yùn)行的實(shí)現(xiàn)方法

    go程序部署到linux上運(yùn)行的實(shí)現(xiàn)方法

    本文主要介紹了go程序部署到linux上運(yùn)行的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • golang使用sort接口實(shí)現(xiàn)排序示例

    golang使用sort接口實(shí)現(xiàn)排序示例

    這篇文章主要介紹了golang使用sort接口實(shí)現(xiàn)排序的方法,簡單分析了sort接口的功能并實(shí)例演示了基于sort接口的排序?qū)崿F(xiàn)方法,需要的朋友可以參考下
    2016-07-07
  • go?sync.Once實(shí)現(xiàn)高效單例模式詳解

    go?sync.Once實(shí)現(xiàn)高效單例模式詳解

    這篇文章主要為大家介紹了go?sync.Once實(shí)現(xiàn)高效單例模式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • GoFrame?gredis緩存DoVar及Conn連接對象的自動(dòng)序列化

    GoFrame?gredis緩存DoVar及Conn連接對象的自動(dòng)序列化

    這篇文章主要為大家介紹了GoFrame?gredis干貨DoVar?Conn連接對象自動(dòng)序列化詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Go語言const&iota的實(shí)現(xiàn)示例

    Go語言const&iota的實(shí)現(xiàn)示例

    本文主要介紹了Go語言const&iota的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-04-04
  • Golang中println和fmt.Println區(qū)別解析

    Golang中println和fmt.Println區(qū)別解析

    Golang 中打印數(shù)據(jù)通常使用 fmt.Println() 方法,也可以使用內(nèi)置的 println() 方法。這兩個(gè)方法大家可能都使用過,它們的區(qū)別是什么呢?本文給大家詳細(xì)講解,感興趣的朋友跟隨小編一起看看吧
    2023-03-03
  • Go語言利用excelize庫自動(dòng)化操作Excel的實(shí)戰(zhàn)指南

    Go語言利用excelize庫自動(dòng)化操作Excel的實(shí)戰(zhàn)指南

    這篇文章主要為大家詳細(xì)介紹了如何使用Go語言自動(dòng)化操作Excel,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下吧
    2026-03-03
  • Go中變量命名規(guī)則與實(shí)例

    Go中變量命名規(guī)則與實(shí)例

    命名規(guī)則涉及變量、常量、全局函數(shù)、結(jié)構(gòu)、接口、方法等的命名,下面這篇文章主要給大家介紹了關(guān)于Go中變量命名的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-01-01
  • go如何使用cobra啟動(dòng)項(xiàng)目

    go如何使用cobra啟動(dòng)項(xiàng)目

    本文介紹了如何使用Go語言的Cobra庫來啟動(dòng)項(xiàng)目,包括基本使用和項(xiàng)目開發(fā)中的具體實(shí)現(xiàn),本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2025-11-11
  • Go語言入門教程之基礎(chǔ)語法快速入門

    Go語言入門教程之基礎(chǔ)語法快速入門

    這篇文章主要介紹了Go語言入門教程之基礎(chǔ)語法快速入門,本文講解了值類型、變量、常量、循環(huán)、條件語句、條件枚舉等內(nèi)容,需要的朋友可以參考下
    2014-11-11

最新評論

张家口市| 柯坪县| 灵武市| 屏南县| 石狮市| 珠海市| 蕉岭县| 来安县| 五常市| 长葛市| 博湖县| 竹溪县| 外汇| 阿拉善右旗| 宜章县| 汝州市| 仁化县| 图木舒克市| 保亭| 朝阳市| 治县。| 栾城县| 彩票| 敖汉旗| 永济市| 新疆| 肇州县| 九江县| 贵阳市| 竹山县| 瓦房店市| 澜沧| 平山县| 吴川市| 曲周县| 荥经县| 双鸭山市| 乌兰察布市| 班戈县| 大邑县| 邳州市|