站長(zhǎng)資訊網(wǎng)
        最全最豐富的資訊網(wǎng)站

        go語(yǔ)言中函數(shù)是什么意思

        在go語(yǔ)言中,函數(shù)是組織好的、可重復(fù)使用的、用來(lái)實(shí)現(xiàn)單一具體或相關(guān)聯(lián)功能的代碼段(塊);其主要目的是提高應(yīng)用的模塊性和代碼的重復(fù)利用率,更好的管理代碼,模塊化開(kāi)發(fā)。函數(shù)通常使用參數(shù)和返回值,與調(diào)用者交互數(shù)據(jù);參數(shù)給函數(shù)傳遞數(shù)據(jù),返回值,函數(shù)將處理好的數(shù)據(jù)傳遞給調(diào)用者。

        go語(yǔ)言中函數(shù)是什么意思

        php入門(mén)到就業(yè)線(xiàn)上直播課:進(jìn)入學(xué)習(xí)
        Apipost = Postman + Swagger + Mock + Jmeter 超好用的API調(diào)試工具:點(diǎn)擊使用

        本教程操作環(huán)境:windows7系統(tǒng)、GO 1.18版本、Dell G3電腦。

        函數(shù)是組織好的、可重復(fù)使用的、用來(lái)實(shí)現(xiàn)單一或相關(guān)聯(lián)功能的代碼段,其可以提高應(yīng)用的模塊性和代碼的重復(fù)利用率。

        函數(shù)概述

        函數(shù),function,獨(dú)立的,用于實(shí)現(xiàn)具體功能的代碼塊。主要目的,是代碼的重用(重復(fù)使用),更好的管理代碼,模塊化開(kāi)發(fā)。 函數(shù)通常使用參數(shù)和返回值,與調(diào)用者交互數(shù)據(jù)。參數(shù)給函數(shù)傳遞數(shù)據(jù),返回值,函數(shù)將處理好的數(shù)據(jù)傳遞給調(diào)用者。 Go語(yǔ)言中函數(shù)被稱(chēng)為一等公民(first-class)。意味著支持高階函數(shù),支持匿名函數(shù),支持閉包等特性,可以滿(mǎn)足接口等高級(jí)函數(shù)特性。

        函數(shù)定義

        函數(shù)構(gòu)成了代碼執(zhí)行的邏輯結(jié)構(gòu),在Go語(yǔ)言中,函數(shù)的基本組成為:關(guān)鍵字 func、函數(shù)名、參數(shù)列表、返回值、函數(shù)體和返回語(yǔ)句,每一個(gè)程序都包含很多的函數(shù),函數(shù)是基本的代碼塊。

        語(yǔ)法:

        • 定義:

        func 函數(shù)名(形參列表)(返回值類(lèi)型列表) {   函數(shù)體,通常會(huì)有return語(yǔ)句,返回值 }
        登錄后復(fù)制

        • 調(diào)用:

        函數(shù)名(實(shí)參列表)
        登錄后復(fù)制

        函數(shù)名:函數(shù)的標(biāo)識(shí)符,用于找到函數(shù),內(nèi)部是一個(gè)指向函數(shù)代碼的地址。 形參列表:由變量和類(lèi)型構(gòu)成 返回值類(lèi)型列表:函數(shù)返回值的類(lèi)型,多個(gè)返回值需要指定多個(gè)。 函數(shù)體:實(shí)現(xiàn)函數(shù)功能的具體語(yǔ)句。 return語(yǔ)句:返回值語(yǔ)句

        以上定的為命名函數(shù),不能定義在其他函數(shù)內(nèi)部。

        函數(shù)參數(shù)

        用于在調(diào)用函數(shù)時(shí)向函數(shù)傳遞數(shù)據(jù)。 實(shí)參,實(shí)際參數(shù)。調(diào)用時(shí)給的參數(shù)。指的是具有的特定實(shí)際數(shù)據(jù)的參數(shù)。 形參,形式參數(shù)。定義時(shí)使用的參數(shù)。指的是用來(lái)表示函數(shù)需要參數(shù),而定義時(shí)參數(shù)是沒(méi)有任實(shí)際何數(shù)據(jù)的。 當(dāng)調(diào)用時(shí)會(huì)發(fā)生使用實(shí)參為形參變量賦值的過(guò)程,稱(chēng)為參數(shù)的傳遞。在函數(shù)的執(zhí)行期間,形參是有具體數(shù)據(jù)的,形參當(dāng)于函數(shù)內(nèi)聲明的變量。

        參數(shù)的傳遞,分為值傳遞,地址傳遞兩種方式。地址傳遞時(shí),需要形參定義為指針類(lèi)型,調(diào)用時(shí)需要取得地址傳參。示例代碼:

        func funcTest(p1 int, p2 *int) {   p1++   *p2++   fmt.Println(p1, *p2) } func main() {   var (     a1 = 42     a2 = 42   )   funcTest(a1, &a2)   // 參數(shù)賦值過(guò)程   fmt.Println(a1, a2) }
        登錄后復(fù)制

        以上會(huì)輸出

        43 43 42 43
        登錄后復(fù)制

        值傳遞,函數(shù)會(huì)得到實(shí)參的一份拷貝。地址傳遞,函數(shù)會(huì)得到實(shí)參地址,這樣函數(shù)內(nèi)通過(guò)地址對(duì)變量的修改,同時(shí)影響實(shí)參。

        Go支持rest…不定數(shù)量參數(shù),定義時(shí)將不定數(shù)量形參放在形參列表的最后定義,使用 …Type的方式,演示:

        定義: func funcTest(op string, nums ...int) {   fmt.Println(nums) // [4, 1, 55, 12], slice切片型數(shù)據(jù) } 調(diào)用 funcTest("someOp", 4, 1, 55, 12)
        登錄后復(fù)制

        接收到的參數(shù)為slice切片類(lèi)型。

        函數(shù)返回值

        return語(yǔ)句用于生成返回值。需要在函數(shù)定義時(shí)確定返回值類(lèi)型,支持多值返回。演示語(yǔ)法:

        func funcTest() (int, string) {   return 42, "Hank" }
        登錄后復(fù)制

        可以在定義時(shí),聲明返回的變量。這個(gè)做法叫命名返回,演示為:

        func funcTest() (num int, title string) {   num = 42   title = "Hank"   return }
        登錄后復(fù)制

        不用return任何數(shù)據(jù),直接return即可!

        函數(shù)變量

        函數(shù)可以看作一種特殊的指針類(lèi)型,可以和其他類(lèi)型一樣被保存在變量中。通過(guò)函數(shù)標(biāo)識(shí)符和變量都可以訪(fǎng)問(wèn)到該函數(shù),演示如下:

        func funcTest() {   fmt.Println("func() type") } func main() {   fmt.Printf("%T, (%v)n", funcTest, funcTest)   fn := funcTest   fmt.Printf("%T, (%v)n", fn, fn)   funcTest()   fn() }
        登錄后復(fù)制

        執(zhí)行結(jié)果:

        func(), (0x48fe20) func(), (0x48fe20) func() type func() type
        登錄后復(fù)制

        可見(jiàn),函數(shù)標(biāo)識(shí)符就是指向函數(shù)的指針。可以賦值給其他變量。

        函數(shù)參數(shù)

        函數(shù)也可以作為其他函數(shù)的參數(shù)來(lái)使用,演示如下:

        func funcSuccess() { } func funcAsync(handle func()) {   // 調(diào)用函數(shù)參數(shù)   handle() } // 傳遞函數(shù)到其他函數(shù) funcAsync(success)
        登錄后復(fù)制

        這種回調(diào)函數(shù)的使用語(yǔ)法,在處理異步邏輯時(shí)十分有用。

        匿名函數(shù)

        可以定義匿名函數(shù)。可以將匿名函數(shù)保存到變量中,作為參數(shù)傳遞,或者立即調(diào)用。如果函數(shù)時(shí)臨時(shí)使用函數(shù),則匿名函數(shù)是一個(gè)好選擇。示例語(yǔ)法:

        賦值給變量 fn := func() { } fn()  // 作為參數(shù) someFunc(func() {   })  // 立即調(diào)用 func() {   }()
        登錄后復(fù)制

        閉包

        由于匿名函數(shù)可以定義在其他函數(shù)內(nèi),同時(shí)變量的作用域?yàn)閷盈B的,也就是匿名函數(shù)可以會(huì)訪(fǎng)問(wèn)其所在的外層函數(shù)內(nèi)的局部變量。當(dāng)外層函數(shù)運(yùn)行結(jié)束后,匿名函數(shù)會(huì)與其使用的外部函數(shù)的局部變量形成閉包。示例代碼:

        var fn func() func outer() {   v := 42   fn = func() {     v ++     fmt.Print(v)   } }  outer() fn() // 43
        登錄后復(fù)制

        此例中,fn 對(duì)應(yīng)的匿名函數(shù)與 outer() 的局部變量 v,就形成了閉包。

        函數(shù)調(diào)用示意圖

        var v = "global" func funcTest(v) {   v = "funcTest"   fmt.Println(v) } func main() {   v := "main"   funcTest(v) }
        登錄后復(fù)制

        代碼編譯期間,會(huì)將函數(shù)代碼存放在內(nèi)存代碼區(qū)。 函數(shù)被調(diào)用時(shí),在運(yùn)行期間會(huì)在函數(shù)運(yùn)行棧區(qū)開(kāi)辟函數(shù)棧,內(nèi)部由局部變量標(biāo)識(shí)符列表(就是局部變量),上層標(biāo)識(shí)符列表引用等信息。直到運(yùn)行結(jié)束,此空間才會(huì)被出棧,釋放。 函數(shù)內(nèi)部調(diào)用了新函數(shù),新函數(shù)的執(zhí)行空間入棧,要等到新函數(shù)執(zhí)行空間出棧,調(diào)用他的函數(shù)才會(huì)被出棧。 以上代碼的運(yùn)行邏輯圖如下:

        go語(yǔ)言中函數(shù)是什么意思

        遞歸調(diào)用

        函數(shù)內(nèi)部調(diào)用函數(shù)本身。稱(chēng)之為遞歸調(diào)用。示例代碼:

        func funcTest() {   fmt.Println("run")   funcTest() }
        登錄后復(fù)制

        定義實(shí)現(xiàn)遞歸調(diào)用函數(shù)時(shí),通常需要定義一個(gè)出口。用來(lái)確定何時(shí)不再進(jìn)行遞歸調(diào)用了。一旦滿(mǎn)足條件,則調(diào)用停止。例如:

        func funcTest(v) {   fmt.Println(v, "run")   v ++   if v <= 10 {     funcTest()   } }
        登錄后復(fù)制

        典型的應(yīng)用有,樹(shù)狀菜單的處理,遍歷目錄,快速排序等。 遞歸調(diào)用的優(yōu)勢(shì)是編碼簡(jiǎn)單,與描述的業(yè)務(wù)邏輯保持一致。

        贊(0)
        分享到: 更多 (0)
        網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
        主站蜘蛛池模板: 日韩精品无码免费视频| 无码人妻精品一区二区三区久久 | 久久久91人妻无码精品蜜桃HD| 国产精品看高国产精品不卡| 亚洲国产精品一区二区九九| 国产三级精品三级在专区| 99国产欧美精品久久久蜜芽| 香蕉久久夜色精品升级完成| 欧美久久亚洲精品| 国产亚洲精品无码拍拍拍色欲| 欧美精品国产精品| 国产第一福利精品导航| 国语精品一区二区三区| 少妇人妻偷人精品视频| 一本色道久久88综合日韩精品| 久久露脸国产精品| 久草视频精品在线| 国产精品麻豆欧美日韩ww| 久久久精品午夜免费不卡| japanese乱人伦精品| 国产美女久久精品香蕉69| 欧美jizzhd精品欧美| 久久精品国产网红主播| 久久亚洲美女精品国产精品| 秋霞午夜鲁丝片午夜精品久| 91原创国产精品| 亚洲精品乱码久久久久久久久久久久 | 精品人妻人人做人人爽| 精品国产污污免费网站入口在线| 亚洲国产精品久久久久久| 国产乱码精品一区二区三| 久热这里只有精品12| 国产精品无码永久免费888| 国产精品亚洲аv无码播放| 亚洲国产精品第一区二区三区| 老司机91精品网站在线观看 | 国产乱码精品一区二区三| 国产精品亚洲欧美一区麻豆| 精品久久久久久中文字幕人妻最新| 久久精品国产精品亚洲下载| 大胸国产精品视频|