Go入門系列(四)函數(shù)

目錄:
一兢哭、基礎
二领舰、匿名
三、接口
四迟螺、錯誤處理

一冲秽、基本函數(shù)

Go語言的函數(shù)聲明格式為:

func function_name( [parameter list] ) [return_types] {
   函數(shù)體
}
func:函數(shù)由 func 開始聲明
function_name:函數(shù)名稱,函數(shù)名和參數(shù)列表一起構(gòu)成了函數(shù)簽名煮仇。
parameter list:參數(shù)列表劳跃,參數(shù)就像一個占位符,當函數(shù)被調(diào)用時浙垫,你可以將值傳遞給參數(shù)刨仑,這個值被稱為實際參數(shù)。參數(shù)列表指定的是參數(shù)類型夹姥、順序杉武、及參數(shù)個數(shù)。參數(shù)是可選的辙售,也就是說函數(shù)也可以不包含參數(shù)轻抱。
return_types:返回類型,函數(shù)返回一列值旦部。return_types 是該列值的數(shù)據(jù)類型祈搜。有些功能不需要返回值,這種情況下 return_types 不是必須的士八。
函數(shù)體:函數(shù)定義的代碼集合容燕。

基本的聲明、調(diào)用婚度、傳參方式如下:

func main() {
    a,b:=who("rabbit",18)
    fmt.Println(a,b)
}

func who(name string, age int) (string, int) {
    return name, age
}
#輸出
rabbit 18

二蘸秘、匿名函數(shù)

匿名函數(shù)是指不需要定義函數(shù)名的一種函數(shù)實現(xiàn)方式,由一個不帶函數(shù)名的函數(shù)聲明和函數(shù)體組成,上一章我們提到過醋虏,函數(shù)類型是變量的一種寻咒,所以匿名函數(shù)往往以變量方式傳遞。
可以使用變量傳遞然后賦值:

func main() {
    who:=func (name string, age int) (string, int) {
        return name, age
    }
    a,b:=who("rabbit",18)
    fmt.Println(a,b)
}
#輸出
rabbit 18

也可以直接賦值:

func main() {
    a,b:=func (name string, age int) (string, int) {
        return name, age
    }("rabbit",18)
    fmt.Println(a,b)
}
#輸出
rabbit 18

其使用方式類似C語言中的回調(diào)函數(shù)颈嚼。
另外在此我們再回顧一個概念:閉包函數(shù)毛秘,聲明在一個函數(shù)中的函數(shù),叫做閉包函數(shù),而Go語言中的匿名函數(shù)機制粘舟,完美符合閉包函數(shù)的設定熔脂。
其實閉包函數(shù)和匿名函數(shù)的概念在很多語言中很難區(qū)分,至于我的理解柑肴,其實他倆并沒有直接關系霞揉,至少匿名函數(shù)的使用這個行為構(gòu)成了閉包。
多說一句很多其他語言的老玩家都深有感觸晰骑,過度使用閉包容易造成內(nèi)存的浪費适秩,但這一點再Go語言中把控的比較嚴格,筆者作為入門新人不做太多評論硕舆,日后再來反饋秽荞。

三、接口

接口抚官,在軟件開發(fā)流程中對團隊契合度來講是個極其重要的地方扬跋,簡單說調(diào)用方和實現(xiàn)方均需要遵守的一種協(xié)議,大家按照統(tǒng)一的方法命名參數(shù)類型和數(shù)量來協(xié)調(diào)邏輯處理的過程凌节。
然后對于我們個人開發(fā)來講钦听,也會方便自己對項目代碼進行合理的維護和功能拓展。
接口格式規(guī)則為:

type 接口類型名 interface{
    方法名1( 參數(shù)列表1 ) 返回值列表1
    方法名2( 參數(shù)列表2 ) 返回值列表2
    …
}

我們通過樣例來實現(xiàn)一個反饋用戶信息的功能:

package main
import (
    "fmt"
    "time"
)

type UserInfo interface {
    login(name string)
    info(name string,age int,city string)
}


type People struct {
    name    string
    age int
    city    string
}


func (people People) login(name string) {
    fmt.Printf("%s您好倍奢,歡迎登陸\n登錄時間為:%s\n",name,time.Now())
}

func (people People) info(name string,age int,city string) {
    fmt.Printf("您的個人資料為:姓名:%s 年齡:%d 城市:%s\n",name,age,city)
}


func main() {
    var userinfo UserInfo
    userinfo = new(People)
    userinfo.login("rabbit")
    userinfo.info("rabbit",18,"Shandong")
}
#輸出
rabbit您好朴上,歡迎登陸
登錄時間為:2020-03-14 16:26:35.2352272 +0800 CST m=+0.003989101
您的個人資料為:姓名:rabbit 年齡:18 城市:Shandong

此外接口還允許嵌套使用,將多個接口進行組合卒煞,作為入門系列我們簡單提及暫不做代碼展開痪宰。

四、錯誤處理

錯誤處理畔裕,區(qū)別與其他語言中的異常處理衣撬。其他語言的老玩家不得不承認一個事實,所謂的異常捕捉機制扮饶,倒不如說異常屏蔽機制淮韭,異常依然發(fā)生了,只不過通過該機制進行了屏蔽不影響程序運行贴届。
Go語言的設計者認為其他語言的異常機制已被過度使用,上層邏輯需要為函數(shù)發(fā)生的異常付出太多的資源,同時毫蚓,如果函數(shù)使用者覺得錯誤處理很麻煩而忽略錯誤占键,那么程序?qū)⒃诓豢深A知的時刻崩潰。
Go語言希望開發(fā)者將錯誤處理視為正常開發(fā)必須實現(xiàn)的環(huán)節(jié)元潘,正確地處理每一個可能發(fā)生錯誤的函數(shù)畔乙,同時,Go語言使用返回值返回錯誤的機制翩概,也能大幅降低編譯器牲距、運行時處理錯誤的復雜度,讓開發(fā)者真正地掌握錯誤的處理钥庇。
綜上所述牍鞠,Go語言不會為你屏蔽異常,它需要你正視可能出現(xiàn)的問題并手動去給出異常提示评姨。
其二难述,為什么錯誤處理放到了這一章節(jié),因為Go語言錯誤處理的機制其本質(zhì)正是接口吐句。
error類型是一個接口類型胁后,這是它的定義:

type error interface {
    Error() string
}

后邊我們在使用官方包的時候會接觸很多已經(jīng)定義好的錯誤提示,在這里我們先嘗試自定義錯誤嗦枢,我們可以在編碼中通過實現(xiàn) error 接口類型來生成錯誤信息攀芯,函數(shù)通常在最后的返回值中返回錯誤信息。使用errors.New 可返回一個錯誤信息文虏。
這么說可能有點抽象侣诺,我們嘗試繼續(xù)升級我們上面的例子,比如加入年齡錯誤檢測择葡。

package main
import (
    "errors"
    "fmt"
    "time"
)

type UserInfo interface {
    login(name string)
    info(name string,age int,city string)
}

func AgeTure(age int) (int, error) {
    if age < 0 || age > 200 {
        return 0, errors.New("請正確輸入您的年齡紧武!")
    }else {
        return 1, nil
    }
}

type People struct {
    name    string
    age int
    city    string
}


func (people People) login(name string) {
    fmt.Printf("%s您好,歡迎登陸\n登錄時間為:%s\n",name,time.Now())
}

func (people People) info(name string,age int,city string) {
    result, err:= AgeTure(age)

    if err != nil {
        fmt.Println(result,err)
    }else {
        fmt.Printf("您的個人資料為:姓名:%s 年齡:%d 城市:%s\n",name,age,city)
    }
}


func main() {
    var userinfo UserInfo
    userinfo = new(People)
    userinfo.login("rabbit")
    userinfo.info("rabbit",1988,"Shandong")
}
#輸出
rabbit您好敏储,歡迎登陸
登錄時間為:2020-03-15 12:40:52.8176698 +0800 CST m=+0.003991401
0 請正確輸入您的年齡阻星!

我們鍵入了錯誤的年齡,觸發(fā)了自定義錯誤提示已添,其中nil是go語言中預先定義的標識符妥箕,可看作是其他語言中的null(NULL),我們可以直接使用nil,而不用聲明它更舞。
另外多說一句畦幢,go其實確實保留了類似其他語言的異常處理機制,但有區(qū)別缆蝉,但是官方的目的是為了調(diào)試宇葱,而非讓你掩蓋異常瘦真,所以我們選擇適應這個語言,僅在此簡單提及:panic 與 recover 是 Go 的兩個內(nèi)置函數(shù)黍瞧,這兩個內(nèi)置函數(shù)用于處理 Go 運行時的錯誤诸尽,panic 用于主動拋出錯誤,recover 用來捕獲 panic 拋出的錯誤印颤。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末您机,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子年局,更是在濱河造成了極大的恐慌际看,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件矢否,死亡現(xiàn)場離奇詭異仲闽,居然都是意外死亡,警方通過查閱死者的電腦和手機兴喂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門蔼囊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人衣迷,你說我怎么就攤上這事畏鼓。” “怎么了壶谒?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵云矫,是天一觀的道長。 經(jīng)常有香客問我汗菜,道長让禀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任陨界,我火速辦了婚禮巡揍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘菌瘪。我一直安慰自己腮敌,他們只是感情好,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布俏扩。 她就那樣靜靜地躺著糜工,像睡著了一般。 火紅的嫁衣襯著肌膚如雪录淡。 梳的紋絲不亂的頭發(fā)上捌木,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天,我揣著相機與錄音嫉戚,去河邊找鬼刨裆。 笑死澈圈,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的崔拥。 我是一名探鬼主播极舔,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼链瓦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起盯桦,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤慈俯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后拥峦,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贴膘,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年略号,在試婚紗的時候發(fā)現(xiàn)自己被綠了刑峡。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡玄柠,死狀恐怖突梦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情羽利,我是刑警寧澤宫患,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站这弧,受9級特大地震影響娃闲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜匾浪,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一皇帮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蛋辈,春花似錦属拾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至挂洛,卻和暖如春礼预,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背虏劲。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工托酸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留褒颈,地道東北人。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓励堡,卻偏偏與公主長得像谷丸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子应结,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

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