Go函數(shù)類型的使用

he&遠方 作品

人永遠都無法知道自己該要什么葫辐,因為人只能活一次,既不能拿它跟前世相比汗贫,也不能在來生加以修正身坐。沒有任何方法可以檢驗?zāi)姆N抉擇是好的,因為不存在任何比較落包。一切都是馬上經(jīng)歷部蛇,僅此一次,不能準(zhǔn)備咐蝇。from 《不能承受的生命之輕》

引用于:http://wufazhuce.com/one/1380

函數(shù)在Go語言中應(yīng)該是最頻繁使用的類型了涯鲁,所以把Go語言定義為函數(shù)式編程語言,個人認(rèn)為也是一種正確的解釋。函數(shù)在Go中既有類似JS語言的用法抹腿,也有C岛请、JAVA這種語言的身影。

和JS語言對比警绩,函數(shù)有以下特性:

  • 普通函數(shù):作為一個普通方法使用崇败。
  • 變長參數(shù):函數(shù)可以接收可變數(shù)目的參數(shù),這在JAVA里面也有類似用法肩祥。
  • 閉包函數(shù):JS中常用的一種模式僚匆,便于維護一些特殊作用域的變量等用法。
  • 對象中的方法:JS中類面向?qū)ο蟮囊环N寫法搭幻。

和C語言對比,函數(shù)有以下特性:

  • 多返回值:函數(shù)可以返回多個不同類型的結(jié)果逞盆。

Go自身定義的函數(shù)特性:

  • 巧用return:合理的利用return中斷程序邏輯檀蹋,會使代碼顯得更簡潔易懂。
  • 作為參數(shù)傳遞:作為回調(diào)函數(shù)來說云芦,更好的規(guī)范了回調(diào)函數(shù)引用的規(guī)范性俯逾。
  • 值傳遞:變量作為參數(shù)傳遞給函數(shù)時,默認(rèn)是值傳遞舅逸,只是變量的一個拷貝桌肴,即副本。函數(shù)內(nèi)部只是對變量副本的操作琉历,不會影響到實際變量本身坠七。

普通函數(shù)、多返回值

// 普通函數(shù)旗笔,不帶參數(shù)
func generalFun() {
    fmt.Println("普通函數(shù)")
}

// 普通函數(shù)彪置,帶參數(shù)
func generalFun1(i int, str string) {
    fmt.Printf("i=%d str=%s\n", i, str)
}

// 普通函數(shù),帶參數(shù)和返回一個結(jié)果
func generalFun2(i int, str string) string {
    tempStr := strconv.Itoa(i) + str
    return tempStr
}

// 普通函數(shù)蝇恶,帶參數(shù)和返回多個結(jié)果拳魁,需要用括號包含所有返回類型
func generalFun3(i int, str string) (int, string) {
    tempStr := strconv.Itoa(i) + str
    tempI := i + i
    return tempI, tempStr
}

上面示例中的普通函數(shù)用法,作為對象的方法也是同樣支持撮弧。

變長參數(shù)

格式:paramName ...type:可理解為函數(shù)可以接收type類型的可變參數(shù)潘懊,參數(shù)名稱為paramName,在函數(shù)內(nèi)部可把paramName理解為類似slice類型的參數(shù)值贿衍∈谥郏可用for _, val := range paramName遍歷傳遞進來的多個參數(shù)。

1舌厨、第一種用法:知道可變參數(shù)的類型時:

func myfun(prefix string, who ...string) {
    //獲取可變參數(shù)的長度
    fmt.Println(len(who))
    for _, val := range who {
        fmt.Println(prefix, val)
    }
}


func Test_fun_Sample01(t *testing.T) {
    myfun("hello:", "Joe", "Anna", "Eileen")
}

Test_fun_Sample01 測試用例執(zhí)行結(jié)果:

hello: Joe
hello: Anna
hello: Eileen

2岂却、第二種用法:不知道可變參數(shù)的類型時:

如果一個變長參數(shù)的類型沒有被指定夭问,則可以使用默認(rèn)的空接口 interface{},這樣就可以接受任何類型的參數(shù)削饵。該方案不僅可以用于長度未知的參數(shù)劲件,還可以用于任何不確定類型的參數(shù)∩ǔ撸可使用for-range循環(huán)以及switch結(jié)構(gòu)對每個參數(shù)的類型進行判斷

type Person struct {
    name string
}

func test8(values ...interface{}) {
    for _, val := range values {
        switch v := val.(type) {
        case int:
            fmt.Println("val type is int ", v)
        case float64:
            fmt.Println("val type is float ", v)
        case string:
            fmt.Println("val type is string ", v)
        case bool:
            fmt.Println("val type is bool ", v)
        case Person:
            fmt.Println("val type is Person ", v.name)
        case *Person:
            fmt.Println("val type is *Person ", v.name)
        default:
            fmt.Println("val type is unknow ", v)
        }
    }
}

func Test_test8(t *testing.T) {
    temp_int := 1
    temp_float := 5.6
    temp_string := "hello"
    temp_bool := true
    temp_person1 := &Person{name: "jack"}
    temp_person2 := Person{name: "rose"}
    var temp_float32 float32 = 6.6

    test8(temp_int, temp_float, temp_string, temp_bool, temp_person1, temp_person2, temp_float32)
}

運行結(jié)果:

val type is int 1
val type is float 5.6
val type is string hello
val type is bool true
val type is *Person jack
val type is Person rose
val type is unknow 6.6

示例中需要注意的兩個地方:

  1. float默認(rèn)定義的類型為float64筋栋。
  2. struct要區(qū)分傳遞的參數(shù)是 Person 類型的結(jié)構(gòu)體變量,還是 Person 類型的指針變量正驻。

巧用return

1弊攘、第一種用法:無返回值函數(shù),在內(nèi)部任何程序執(zhí)行片段使用return 姑曙,直接會跳出該函數(shù)襟交,return下面的程序片段都不會再執(zhí)行。

func fun_return() {
    for i := 0; i < 10; i++ {
        fmt.Printf("%v ", i)
        if i == 3 {
            return
        }
    }
} //0 1 2 3

2伤靠、第二種用法:有返回值函數(shù)捣域,在內(nèi)部任何程序執(zhí)行片段使用return,它下面的程序片段都不會再執(zhí)行宴合,但是程序結(jié)尾必須以return結(jié)束焕梅,否則程序報錯。

func fun_return() int {
    for i := 0; i < 10; i++ {
        fmt.Printf("%v ", i)
        if i == 3 {
            return
        }
    }
    return i
} //0 1 2 3

上面兩個示例卦洽,執(zhí)行結(jié)果一樣贞言,但是唯一不同的就是有返回值函數(shù)程序最后必須有return

值傳遞阀蒂、引用傳遞

任何時候该窗,如果要同步改變函數(shù)外聲明的變量的值時,都要優(yōu)先考慮用指針傳遞蚤霞,即占用內(nèi)存空間少挪捕,又執(zhí)行速度快。

基本類型的參數(shù)傳遞

func test3(str string) {
    str = "go"
    fmt.Printf("str=%s", str)
}

func test4(str *string) {
    *str = "go"
    fmt.Printf("str=%s", *str)
}

func Test_test3(t *testing.T) {
    temp := "hello"
    test3(temp)
    fmt.Println(" temp=", temp) //str=go temp= hello

    test4(&temp)
    fmt.Println(" temp=", temp) //str=go temp= go
}

struct類型的參數(shù)傳遞争便,及對象傳遞

type Person struct {
    name string
}

// 傳遞Person struct類型的變量
func test5(p Person) {
    p.name = "go" // 此時的p為參數(shù)副本
    fmt.Printf("Person.name = %s", p.name)
}

// 傳遞指向Person struct類型的的變量地址
func test6(p *Person) {
    p.name = "go"
    fmt.Printf("Person.name = %s", p.name)
}

func Test_test5(t *testing.T) {
    p := Person{"hello"}
    test5(p)
    fmt.Println(" p.name=", p.name) //Person.name = go p.name= hello

    test6(&p)
    fmt.Println(" p.name=", p.name) //Person.name = go p.name= go

    p1 := new(Person)
    p1.name = "jack"
    test6(p1)
    fmt.Println(" p1.name=", p1.name) //Person.name = go p1.name= go
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末级零,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子滞乙,更是在濱河造成了極大的恐慌奏纪,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件斩启,死亡現(xiàn)場離奇詭異序调,居然都是意外死亡,警方通過查閱死者的電腦和手機兔簇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門发绢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來硬耍,“玉大人,你說我怎么就攤上這事边酒【瘢” “怎么了?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵墩朦,是天一觀的道長坯认。 經(jīng)常有香客問我,道長氓涣,這世上最難降的妖魔是什么牛哺? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮劳吠,結(jié)果婚禮上引润,老公的妹妹穿的比我還像新娘。我一直安慰自己痒玩,他們只是感情好椰拒,可當(dāng)我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著凰荚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪褒脯。 梳的紋絲不亂的頭發(fā)上便瑟,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天,我揣著相機與錄音番川,去河邊找鬼到涂。 笑死,一個胖子當(dāng)著我的面吹牛颁督,可吹牛的內(nèi)容都是我干的践啄。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼沉御,長吁一口氣:“原來是場噩夢啊……” “哼屿讽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起吠裆,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤伐谈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后试疙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體诵棵,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年祝旷,在試婚紗的時候發(fā)現(xiàn)自己被綠了履澳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嘶窄。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖距贷,靈堂內(nèi)的尸體忽然破棺而出柄冲,到底是詐尸還是另有隱情,我是刑警寧澤储耐,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布羊初,位于F島的核電站,受9級特大地震影響什湘,放射性物質(zhì)發(fā)生泄漏长赞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一闽撤、第九天 我趴在偏房一處隱蔽的房頂上張望得哆。 院中可真熱鬧,春花似錦哟旗、人聲如沸贩据。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽饱亮。三九已至,卻和暖如春舍沙,著一層夾襖步出監(jiān)牢的瞬間近上,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工拂铡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留壹无,地道東北人。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓感帅,卻偏偏與公主長得像斗锭,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子失球,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理岖是,服務(wù)發(fā)現(xiàn),斷路器实苞,智...
    卡卡羅2017閱讀 134,716評論 18 139
  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,238評論 0 4
  • 1璧微、c語言的函數(shù)有以下特點: (1)才源程序由函數(shù)組成,一個主函數(shù)main()+若干其他函數(shù) C程序中的函數(shù)類似文...
    滕王閣序閱讀 1,347評論 0 6
  • 坐了幾個小時的火車,終于來到了這里荧止。 邊走邊看屹电,這里的景阶剑,這里的人,這里的安靜與熱鬧危号。 興奮的嘴角一直上揚牧愁。 這里...
    來搞事情啦閱讀 314評論 0 5
  • 1999年12月20日,被葡萄牙占領(lǐng)4個世紀(jì)的澳門終于回到祖國母親的懷抱外莲。 祖國母親猪半,的固定搭配出現(xiàn)在20世紀(jì)初,...
    松球42閱讀 263評論 0 1