亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Golang函數(shù)這些神操作你知道哪些

 更新時間:2023年02月16日 16:18:51   作者:TtrOps  
這篇文章主要為大家介紹了一些Golang中函數(shù)的神操作,不知道你都知道哪些呢?文中的示例代碼講解詳細,具有一定的學習價值,需要的可以參考一下

「1. 用type關(guān)鍵字可以定義函數(shù)類型,函數(shù)類型變量可以作為函數(shù)的參數(shù)或返回值。」

package?main

import?"fmt"

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

func?sub(a,?b?int)?int?{
?return?a?-?b
}

type?Task?func(int,?int)?int

func?exec(t?Task,?a,?b?int)?int?{
?return?t(a,?b)
}

func?main()?{
?a?:=?exec(add,?10,?20)
?fmt.Println(a)

?b?:=?exec(sub,?100,?95)
?fmt.Println(b)
}

解析:type Task func(int, int) int,這句是說,使用type關(guān)鍵字定義1個類型為func的Task,這個func有2個int形參、1個int返回值。再看exec這個函數(shù),它有3個形參,形參t的類型是剛定義的函數(shù)類型Task,另外兩個你懂的,我就不說了。

「2. 匿名函數(shù)的玩法是真的騷,看看騷在哪里」

栗子1:匿名函數(shù)可以直接賦給變量

func?main()?{
?var?aaa?=?func(a,?b?int)?int?{
??return?a?+?b
?}
?ret?:=?aaa(89,?78)
?fmt.Println(ret)
}

輸出:

167

栗子2:匿名函數(shù)作為函數(shù)入?yún)?/p>

這個例子感覺跟剛才使用type關(guān)鍵字定義函數(shù)類型的例子有點相同的趕腳,仔細一看,好像也只是在使用的方式上是一樣,定義函數(shù)的套路又是不同的。

func?work(f?func(int,?int)?int,?a,?b?int)?int?{
?return?f(a,?b)
}

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

func?main()?{
?a?:=?work(add,?100,?200)
?fmt.Println(a)
}

輸出:

300

解析:形參f的類型就是匿名函數(shù),繼續(xù)看func(int, int) int,這個匿名函數(shù)接收兩個int形參,返回值也是int類型。另外兩個形參a和b,也是int,想必你懂了,我就不廢話了。

栗子3:匿名函數(shù)作為函數(shù)出參

匿名函數(shù)作為函數(shù)出參(作為函數(shù)返回值),經(jīng)不斷調(diào)測,有3種騷包玩法

騷包玩法1

//?先來個簡單的
func?work()?func()?int?{
?return?func()?int?{
??return?10?+?20
?}
}

func?main()?{
?f?:=?work()
?ret?:=?f()
?fmt.Println(ret)
}

輸出:

30

騷包玩法2

//?再改造下
func?work(a,?b?int)?func()?int?{
?return?func()?int?{
??return?a?+?b
?}
}

func?main()?{
?f?:=?work(500,?20)
?ret?:=?f()
?fmt.Println(ret)
}

輸出:

520

騷包玩法3

//?再次改造
func?work()?func(int,?int)?int?{
?return?func(a,?b?int)?int?{
??return?a?+?b
?}
}

func?main()?{
?f?:=?work()
?ret?:=?f(600,?50)
?fmt.Println(ret)
}

輸出:

650

對3種騷包玩法的簡單解析:

再這里就解析一下第3種玩法,能搞懂這個玩法,前面2個玩法,你就自然懂了。work函數(shù)沒有入?yún)?,但是有出參(也可以說是返回值),出參是匿名函數(shù)func(int, int) int,這個定義在返回值里的匿名函數(shù)有2個int類型的形參(入?yún)ⅲ┖?個int類型的返回值。再看看函數(shù)體內(nèi)部,沒干很復雜活兒,而是直接return了匿名函數(shù),函數(shù)體里的這個匿名函數(shù)是和定義在返回值里的類型保持一致的,也是接收了2個int的形參a和b,返回值也是int,啥也沒干,就做了個相加。好郁悶!不知道你看懂了沒?再看看是如何使用work函數(shù)的,關(guān)鍵點就在這里,調(diào)用work()賦給了變量f,這時候,f它就是一個函數(shù)了,再調(diào)用f(600, 50),想必你已經(jīng)知道了為啥要傳入2個int值,這下搞定!不知道把你繞暈沒,這玩法確實很騷。

「3. 匿名函數(shù)和延遲調(diào)用」

延遲調(diào)用的規(guī)則是:按照「先進后出」的順序,也就是說函數(shù)返回前是會被執(zhí)行的,而且是按照先進后出的順序。如何起到延遲的效果,是需要注冊的,可通過defer關(guān)鍵字進行注冊。那么什么場景下需要用到延遲調(diào)用呢?比如常見的場景:當一個函數(shù)被即將執(zhí)行完后,也就是完成任務(wù)的最后一刻,需要回收和釋放某些資源。

延遲調(diào)用的機制可以配合匿名函數(shù)來使用,這樣就可以讓匿名函數(shù)被直接調(diào)用,只能說是真的騷。

先看個小栗子:

package?main

import?"fmt"

func?work()?bool?{
?fmt.Println("函數(shù)開始工作...")
?defer?func()?{
??fmt.Println("回收相關(guān)資源工作開始!")
?}()
?defer?func()?{
??fmt.Println("清理工作開始!")
?}()
?fmt.Println("函數(shù)正在工作...")
?fmt.Println("函數(shù)工作完畢...")
?return?true
}
func?main()?{
?status?:=?work()
?fmt.Println(status)
}

輸出:

函數(shù)開始工作...
函數(shù)正在工作...
函數(shù)工作完畢...
清理工作開始!
回收相關(guān)資源工作開始!
true

在上面的栗子中,定義了個work函數(shù),先看看輸出的結(jié)果,感受下。在work函數(shù)中,注冊了兩個延遲調(diào)用,work函數(shù)從開始->正在->完畢,結(jié)束后才執(zhí)行defer注冊的匿名函數(shù),這里要著重注意延遲調(diào)用規(guī)則:「先進后出」,也就是先注冊后執(zhí)行。“回收相關(guān)資源工作”是先注冊的,他的執(zhí)行順序排在了“清理工作”的后面。感受到了嗎?

最后說明一下:defer關(guān)鍵字讓匿名函數(shù)實現(xiàn)了可直接調(diào)用,那么使用defer注冊延遲調(diào)用時要注意,defer關(guān)鍵字的后面一定是要函數(shù)或方法的調(diào)用,不能直接寫語句哦。

到此這篇關(guān)于Golang函數(shù)這些神操作你知道哪些的文章就介紹到這了,更多相關(guān)Golang函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go1.18都出泛型了速來圍觀

    Go1.18都出泛型了速來圍觀

    泛型允許程序員在強類型程序設(shè)計語言中編寫代碼時使用一些以后才指定的類型,在實例化時作為參數(shù)指明這些類型,本文通過例子給大家介紹下如何使用泛型,對Go1.18泛型相關(guān)知識感興趣的朋友一起看看吧
    2022-03-03
  • 詳解Golang開啟http服務(wù)的三種方式

    詳解Golang開啟http服務(wù)的三種方式

    這篇文章主要介紹了詳解Golang開啟http服務(wù)的三種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • Go reflect 反射原理示例詳解

    Go reflect 反射原理示例詳解

    這篇文章主要為大家介紹了Go reflect 反射原理示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • golang之tcp自動重連實現(xiàn)方法

    golang之tcp自動重連實現(xiàn)方法

    下面小編就為大家?guī)硪黄猤olang之tcp自動重連實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • GO語言實現(xiàn)文件上傳的示例代碼

    GO語言實現(xiàn)文件上傳的示例代碼

    這篇文章主要分享一下golang實現(xiàn)文件上傳的流程和具體代碼,供大家參考,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助
    2022-08-08
  • Gotify搭建你的消息推送系統(tǒng)

    Gotify搭建你的消息推送系統(tǒng)

    這篇文章主要介紹了Gotify搭建你的消息推送系統(tǒng),今天要分享的是 gotify,是一個用 go 編寫的消息服務(wù)端,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2024-01-01
  • Go語言func匿名函數(shù)閉包示例詳解

    Go語言func匿名函數(shù)閉包示例詳解

    這篇文章主要為大家介紹了Go語言func匿名函數(shù)閉包示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • 詳解Go?將在下個版本支持新型排序算法pdqsort

    詳解Go?將在下個版本支持新型排序算法pdqsort

    這篇文章主要介紹了Go?將在下個版本支持新型排序算法:pdqsort,而就Go支持pdqsort算法,在HN上引起了不少的討論,有人表示,我們研究排序算法這么久了,很驚訝我們還能想出能產(chǎn)生實際改進的優(yōu)化方案。對此,你怎么看,快快上手體驗一下吧
    2022-04-04
  • Go語言中的Iota關(guān)鍵字

    Go語言中的Iota關(guān)鍵字

    這篇文章介紹了Go語言中的Iota關(guān)鍵字,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • Golang中字符串(string)與字節(jié)數(shù)組([]byte)一行代碼互轉(zhuǎn)實例

    Golang中字符串(string)與字節(jié)數(shù)組([]byte)一行代碼互轉(zhuǎn)實例

    golang語言本身就是c的工具集,開發(fā)c的程序用到的大部分結(jié)構(gòu)體,內(nèi)存管理,攜程等,golang基本都有,下面這篇文章主要給大家介紹了關(guān)于Golang中字符串(string)與字節(jié)數(shù)組([]byte)一行代碼互轉(zhuǎn)的相關(guān)資料,需要的朋友可以參考下
    2022-09-09

最新評論