1、使用new函式建立自定義錯誤
建立自定義錯誤最簡單的方法是使用errors包中的New函式
2、使用Errorf給錯誤新增更多資訊
使用fmt包中的Errorf函式,會根據格式說明符,規定錯誤的格式,並返回一個符合該錯誤的字串
3、使用結構體型別和欄位提供錯誤的更多資訊
錯誤可以用實現了error介面的結構體表示
4、使用結構體型別的方法來提供錯誤的更多資訊複製程式碼
1、panic
a:在go語言中,程式一般使用錯誤來處理異常情況
在有些情況,當程式發生異常時,無法繼續執行。在這種情況下,我們會使用panic來終止程式。
當函式發生panic時,它會終止執行,在執行完所有的延遲函式後,程式控制返回到該函式的呼叫方。
這樣的過程會一直持續下去,直到當前協程的所
有函式都返回退出,然後程式列印出panic資訊,接著列印出堆疊跟蹤。
b:程式發生panic時,使用recover可以重新獲得對該程式的控制
可以認為panic和recover與其他語言中的try-catch-finally類似
2、什麼時候應該使用panic
a: 應該儘可能的使用panic和recover。只有當程式不能繼續執行的時候,才使用panic和recover機制
b: panic的用例
一:發生來一個不能恢復的錯誤,此時程式不能繼續執行。一個例子就是web伺服器無法繫結所要
求的埠
二:發生來一個程式設計上的錯誤。假如我們有一個接收指標引數的方法,而其他人使用nil作為參
數呼叫來它
3、發生panic時的defer
如果有延遲函式,會先呼叫它,然後程式控制返回到函式呼叫方
4、recover
a:recover是一個內建函式,用於重新獲得panic協程的控制
b:只有在延遲函式的內部,呼叫recover才有用。在延遲函式內呼叫recover,可以取到panic的
錯誤資訊,並且停止panic續發時間。
5、panic、recover和go協程
只有使用相同的go協程中呼叫recover才管用,recover不能恢復一個不同協程的panic
6、執行時panic
執行時錯誤(如陣列越界)也會導致panic。這等價於呼叫來內建函式panic,其引數由介面
型別runtime.Error給出
7、恢復後獲得堆疊跟蹤
當我們恢復panic時,我們就釋放來它的堆疊跟蹤。有辦法可以列印出堆疊跟蹤,就是使用
Debug包中的PrintStack函式複製程式碼
1、支援頭等函式的程式語言,可以把函式賦值給變數,也可以把函式作為其它函式的引數或返回值
2、匿名函式
沒有名稱的函式
3、使用者自定義的函式型別
type add func(a int,b int) int
3、高階函式
a:接收一個或多個函式作為引數
b:返回值是一個函式
4、閉包
閉包是匿名函式的一個特例,當一個匿名函式所訪問的變數定義在函式體的外部時,就稱這樣的匿名函式為閉包
5、頭等函式的實際用途複製程式碼
反射就是程式能夠在執行時檢查變數和值,求出它們的型別
1、在執行時檢查傳遞過來的結構體引數的型別,找到結構體欄位,接著建立查詢
2、reflect包
在go語言中,reflect實現了執行時反射,reflect包會幫助識別interface{}變數的底層具體型別
和具體值
a:reflect.Type表示interface{}的具體型別
b:reflect.Value表示它的具體值
c:reflect.kind表示該型別的特定類別
3、NumFiled()和Field()方法
NumFiled()方法返回結構體中欄位的數量,而Field(i int)方法返回欄位i的reflect.Value
4、Int()和String()方法
Int和String可以幫助我們分別取出reflect.Value作為int64和string
使用反射編寫清晰和可維護的程式碼是十分困難的,應儘可能避免使用複製程式碼