目錄:
一兢哭、基礎
二领舰、匿名
三、接口
四迟螺、錯誤處理
一冲秽、基本函數(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 拋出的錯誤印颤。