1. Go 語(yǔ)言的函數(shù)與指針

        共 3191字,需瀏覽 7分鐘

         ·

        2021-04-18 00:27

        函數(shù)

        函數(shù)就是一段基本的代碼塊,一般用來(lái)對(duì)需要重復(fù)執(zhí)行的代碼進(jìn)行復(fù)用。在 go 中,函數(shù)是『一等公民』,這與 js 類(lèi)似,也就是可以將函數(shù)當(dāng)做一個(gè)變量進(jìn)行傳遞。

        函數(shù)聲明

        由于是強(qiáng)類(lèi)型語(yǔ)言,與 js 不同,在函數(shù)聲明的過(guò)程中,需要指定參數(shù)與返回值的類(lèi)型。

        func?max?(n1,?n2?int)?int?{
        ??var?result?int
        ??if?n1?>=?n2?{
        ????result?=?n1
        ??}
        ??if?n1?<?n2?{
        ????result?=?n2
        ??}
        ??return?result
        }
        f75a12f75a7e105dde573a899deaee31.webp

        在聲明函數(shù)參數(shù)和類(lèi)型的時(shí)候,與聲明變量類(lèi)似,可以一次性指定多個(gè)參數(shù)的類(lèi)型,也可以分別指定多個(gè)參數(shù)為不同類(lèi)型。

        func?max?(n1?int,?n2?int)?int?{
        ??……
        }

        如果函數(shù)返回值有多個(gè),在指定返回類(lèi)型的時(shí)候,需要指定每個(gè)返回值的類(lèi)型。

        func?max?(n1?int,?n2?int)?(error,?int)?{
        ??……
        ??return?errors.New(""),?result
        }

        上面的代碼,表示返回的時(shí)候需要返回兩個(gè)值,第一個(gè)值為 error 對(duì)象,用來(lái)表示執(zhí)行期間是否出現(xiàn)異常。這種方式也是 Node.js 中常見(jiàn)的 error-first callback 的寫(xiě)法。

        特殊函數(shù)

        在 go 中,有兩個(gè)特殊函數(shù):main、init,這兩個(gè)函數(shù)聲明之后,一般不需要主動(dòng)調(diào)用,會(huì)有自動(dòng)執(zhí)行的機(jī)制。

        ?? func main()

        main 函數(shù)是 go 語(yǔ)言中默認(rèn)的入口函數(shù),只能應(yīng)用于 package main 中,如果在其他的 package 中不會(huì)執(zhí)行。main 函數(shù)有如下幾點(diǎn)需要注意:

        • 不能定義參數(shù);
        • 不能定義返回值;
        • 必須在 package main 中聲明;

        ?? func init()

        init 函數(shù)所有的包啟動(dòng)的時(shí)候都會(huì)執(zhí)行,執(zhí)行時(shí)機(jī)比 main 函數(shù)早,與 main 函數(shù)一樣,不能定義參數(shù)和返回值。

        package?main

        import?"fmt"

        func?init()?{
        ?fmt.Println("執(zhí)行?init?函數(shù)\n")
        }
        func?main()?{
        ?fmt.Println("執(zhí)行?main?函數(shù)\n")
        }
        a64e604088d00fe041d53701ee23858d.webp

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

        函數(shù)的調(diào)用比較簡(jiǎn)單,和其他編程語(yǔ)言類(lèi)似,只需要將函數(shù)需要接受的參數(shù)傳入其中,在執(zhí)行結(jié)束后,就能得到對(duì)應(yīng)的返回值。

        //?定義?max?函數(shù)
        func?max?(n1,?n2?int)?int?{
        ??var?result?int
        ??if?n1?>=?n2?{
        ????result?=?n1
        ??}
        ??if?n1?<?n2?{
        ????result?=?n2
        ??}
        ??return?result
        }

        func?main?()?{
        ?var?result?=?max(5,?100)
        ?fmt.Println("max?return",?result)
        }
        4f248af47b9c8b44d98ff5e8f11049bf.webp

        匿名函數(shù)

        匿名函數(shù)就是一個(gè)沒(méi)有定義函數(shù)名的函數(shù),匿名函數(shù)可以當(dāng)成一個(gè)值,將其賦值放到某個(gè)變量中。這也是之前為什么說(shuō)函數(shù)是『一等公民』,就是可以將函數(shù)當(dāng)成一個(gè)變量。

        var?max?=?func?(n1,?n2?int)?int?{
        ??var?result?int
        ??if?n1?>=?n2?{
        ????result?=?n1
        ??}
        ??if?n1?<?n2?{
        ????result?=?n2
        ??}
        ??return?result
        }
        var?result?=?max(5,?100)
        fmt.Println("max?return",?result)

        立即執(zhí)行函數(shù)

        由于 go 中的函數(shù)是 『一等公民』,可以在聲明之后立即執(zhí)行,就是在函數(shù)聲明結(jié)束后,直接加上一個(gè)括號(hào),表示該函數(shù)會(huì)立即執(zhí)行,執(zhí)行之后的結(jié)果可以通過(guò)變量進(jìn)行接收。

        import?"math"

        var?Pi?=?func?()?float64?{
        ??return?math.Pi
        }()

        fmt.Println("PI?=",Pi)
        4aca43c40ee2f549f5ae687688b3c9e4.webp

        閉包

        閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)。在本質(zhì)上,閉包是將函數(shù)內(nèi)部和函數(shù)外部連接起來(lái)的橋梁。 ——百度百科

        上面的描述來(lái)自百度百科,初次看概念比較難理解,如果站在使用的角度來(lái)說(shuō),閉包就是在一個(gè)函數(shù)調(diào)用后,返回另一個(gè)匿名函數(shù),并保持當(dāng)前函數(shù)內(nèi)的局部變量,可以給匿名函數(shù)引用。

        下面我們可以簡(jiǎn)單實(shí)現(xiàn)一個(gè)迭代器函數(shù),該函數(shù)接受一個(gè)切片,返回一個(gè)匿名函數(shù),該匿名函數(shù)每次執(zhí)行,都會(huì)取出切片的一個(gè)值,直到全部讀取。

        func?generate(slice?[]int)?func()?(bool,?int)?{
        ?i?:=?0
        ?length?:=?len(slice)
        ?return?func?()?(bool,?int)?{
        ??if?i?>=?length?{
        ???return?true,?0
        ??}
        ??var?result?=?slice[i]
        ??i++
        ??return?false,?result
        ?}
        }

        func?main()?{
        ?slice?:=?[]int{1,?2,?3,?4,?5}
        ?nextNum?:=?generate(slice)
        ?done,?result?:=?nextNum()
        ??//?直到?done?不等于?false,才停止
        ?for?done?==?false?{
        ??fmt.Println(result,?done)
        ??done,?result?=?nextNum()
        ?}
        ??fmt.Println(result,?done)
        }
        a94a3f4744f7e963f4b2ae12f4de28b6.webpe40c2fe350f842cfc84be5e812b2b626.webp

        指針

        我們前面常說(shuō)的變量指的一般是一個(gè)值,指針是指向該變量存儲(chǔ)在內(nèi)存的位置。指針也可以存儲(chǔ)在一個(gè)變量中,該變量稱(chēng)為『指針變量』。

        d7c19eade1904d33be8150b8adf49fcf.webp

        指針變量聲明

        聲明指針變量時(shí),需要指針指向哪一種類(lèi)型,因?yàn)椴煌?lèi)型的值在內(nèi)存占用的空間大小不一樣,僅僅知道內(nèi)存地址還是不夠,還需要知道該變量在內(nèi)存中占用多大空間。聲明指針變量只需要在類(lèi)型前,加上 * 即可。

        var?point?*int?//?聲明?int?類(lèi)型的指針

        指針變量賦值

        給指針變量賦值,需要在對(duì)應(yīng)類(lèi)型的變量前加上&符號(hào),表示取出該變量的地址。

        var?i?=?1
        var?point?*int
        point?=?&i

        值傳遞與引用傳遞

        一般情況下,我們傳入函數(shù)的參數(shù)僅為變量的值,這樣的傳遞被稱(chēng)為值傳遞,在函數(shù)內(nèi)對(duì)參數(shù)修改也不會(huì)影響到外部變量。

        func?addOne(slice?[]int,?number?int)?{
        ?slice?=?append(slice,?number)
        ?fmt.Println("inner?slice?=",??slice)
        }

        slice?:=?[]int{1,?2,?3}
        addOne(slice,?100)
        fmt.Println("outer?slice?=",??slice)

        上述代碼中,我們寫(xiě)了一個(gè)函數(shù),會(huì)對(duì)傳入的切片追加一個(gè)值,調(diào)用之后,我們會(huì)發(fā)現(xiàn)外部切片的值并沒(méi)有發(fā)生變量。

        1a6f08c5e9b3867c2977272b14e2c56d.webp

        如果需要外部變量的值會(huì)跟隨函數(shù)調(diào)用發(fā)生變化,就需要將變量的指針傳入函數(shù)中,這樣的傳遞被稱(chēng)為引用傳遞。這樣在函數(shù)中修改參數(shù)就會(huì)影響到外部的變量了。

        //?此時(shí)?slice?為指針變量
        func?addOne(slice?*[]int,?number?int)?{
        ??//?通過(guò)?*slice?可以取出?slice?指針對(duì)應(yīng)的值
        ?*slice?=?append(*slice,?number)
        ?fmt.Println("inner?slice?=",??*slice)
        }

        slice?:=?[]int{1,?2,?3}
        addOne(&slice,?100)
        fmt.Println("outer?slice?=",??slice)
        27af72f82b4a6faae5485205dbadfebb.webpab09751b2ab7ebd8c98e0c6180d2add1.webp


        瀏覽 70
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
          
          

            1. 国产91福利 | 亚洲小视频在线播放 | 久久国产乱子伦精品免费女,网站 | 色五月婷婷大香蕉 | jizz欧美性9 |