1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Go 專欄|函數(shù)那些事

        共 5122字,需瀏覽 11分鐘

         ·

        2021-08-11 14:16

        曾經很長一段時間,我都為自己是互聯(lián)網(wǎng)科技公司的一員而感到自豪,我覺得我們與眾不同。

        我們的管理更扁平化,沒有那么多官僚主義,充滿活力,朝氣蓬勃。而且我們的產品正在改變大家的衣食住行,我們正在改變世界。

        但近幾年發(fā)生的一系列事件,都讓我的信心產生動搖,不停在捶打我:醒醒吧,兄弟,事實不是你想象的那樣。

        我能做些什么呢?不知道。

        還是努力更文吧,爭取早日不做打工人。

        函數(shù)定義

        函數(shù)包括以下幾個部分:關鍵詞 func,函數(shù)名,參數(shù)列表,返回列表和函數(shù)體。

        func name(param-list) ret-list {
            body
        }

        函數(shù)可以沒有參數(shù),也可以沒有返回值。

        func funcA() {
            fmt.Println("i am funcA"// i am funcA
        }

        函數(shù)的類型稱作函數(shù)簽名,當兩個函數(shù)的參數(shù)列表和返回列表相同時,則兩個函數(shù)的類型或簽名就相同。

        func add(x int, y int) int {
            return x + y
        }

        func sub(x int, y int) (z int) {
            z = x - y
            return
        }

        fmt.Printf("%T\n", add) // func(int, int) int
        fmt.Printf("%T\n", sub) // func(int, int) int

        參數(shù)

        多個相鄰類型的參數(shù)可以使用簡寫模式,所以剛才的 addsub 函數(shù)還可以這樣寫:

        func add(x, y int) int {
            return x + y
        }

        func sub(x, y int) (z int) {
            z = x - y
            return
        }

        支持不定參數(shù),使用 ...type 語法。注意不定參數(shù)必須是函數(shù)的最后一個參數(shù)。

        func funcSum(args ...int) (ret int) {
            for _, arg := range args {
                ret += arg
            }
            return
        }

        // 不定參數(shù)
        fmt.Println(funcSum(12))    // 3
        fmt.Println(funcSum(123)) // 6

        也可以使用 slice 作為實參傳入,需要使用 ... 將 slice 展開:

        // slice 參數(shù)
        s := []int{1234}
        fmt.Println(funcSum(s...)) // 10

        其實,使用 slice 作為形參同樣可以達到相同的效果,但區(qū)別就是傳參的時候,必須要構造出來一個 slice 才行,沒有不定參數(shù)使用起來方便。

        func funcSum1(args []int) (ret int) {
            for _, arg := range args {
                ret += arg
            }
            return
        }

        fmt.Println(funcSum1(s))   // 10

        返回值

        函數(shù)可以返回一個值,也可以返回多個值。

        // 多返回值
        func swap(x, y int) (intint) {
            return y, x
        }

        // 多返回值
        fmt.Println(swap(12)) // 2 1

        如果有不需要的返回值,使用 _ 將其忽略:

        x, _ := swap(12)
        fmt.Println(x) // 2

        支持命名返回值。使用命名返回值的話,直接使用 return 即可,后面不用跟返回值名。

        前面不定參數(shù)的例子就是通過這種方式來寫的:

        func funcSum(args ...int) (ret int) {
            for _, arg := range args {
                ret += arg
            }
            return
        }

        再來對比一下,如果不是采用命名返回值,應該怎么寫:

        func funcSum(args ...int) int {
            ret := 0
            for _, arg := range args {
                ret += arg
            }
            return ret
        }

        匿名函數(shù)

        匿名函數(shù)是指不需要定義函數(shù)名的一種函數(shù)實現(xiàn)方式。可以直接賦值給函數(shù)變量,可以當作實參,也可以作為返回值,還可以直接調用。

        // 匿名函數(shù)
        sum := func(a, b int) int { return a + b }
        fmt.Println(sum(12)) // 3

        作為參數(shù):

        // 匿名函數(shù)作為參數(shù)
        func funcSum2(f func(intint) intxy intint {
            return f(x, y)
        }

        fmt.Println(funcSum2(sum, 35)) // 8

        作為返回值:

        // 匿名函數(shù)作為返回值
        func wrap(op string) func(intint) int {
            switch op {
            case "add":
                return func(a, b int) int {
                    return a + b
                }
            case "sub":
                return func(a, b int) int {
                    return a + b
                }

            default:
                return nil
            }
        }

        f := wrap("add")
        fmt.Println(f(24)) // 6

        直接調用:

        // 直接調用
        fmt.Println(func(a, b int) int { return a + b }(45)) // 9

        總結

        函數(shù)在之前的文章中已經使用過了,這篇再系統(tǒng)全面總結一下都有哪些需要注意的點。

        包括函數(shù)定義,參數(shù),返回和匿名函數(shù)。其實還有一個閉包,通過匿名函數(shù)來實現(xiàn)。但我感覺閉包使用的并不是很多,就沒有寫,感興趣的同學可以自己搜搜看。

        函數(shù)可以把復雜的程序分成更小的模塊,使程序可讀性更強,復用性更高,維護性更好。在開發(fā)過程中一定要具備將特定功能抽象成函數(shù)的能力,而不是將所有代碼都寫在一起,代碼堆成一坨。這樣的代碼除了不好維護,重點是時間長了自己都不想看。


        文章中的腦圖和源碼都上傳到了 GitHub,有需要的同學可自行下載。

        地址: https://github.com/yongxinz/gopher/tree/main/sc

        關注公眾號 AlwaysBeta,回復「goebook」領取 Go 編程經典書籍。

        Go 專欄文章列表:

        Go 專欄|流程控制,一網(wǎng)打盡

        Go 專欄|復合數(shù)據(jù)類型:字典 map 和 結構體 struct

        Go 專欄|復合數(shù)據(jù)類型:數(shù)組和切片 slice

        瀏覽 41
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            艹逼app | 高清无码网 | 善良的女儿中字头特别篇剧情解析 | 国产又黄的a级鬼片色鬼投胎 | 操死骚逼 | 国产精品自拍网站 | 免费 成人 美女姛免费看 | 污污视频免费在线看 | 免费收看一级A黄色片 | 亚洲天堂成人 |