goLang學習筆記(四)

Jsp發表於2018-08-20

三十一:自定義錯誤

1、使用new函式建立自定義錯誤
    建立自定義錯誤最簡單的方法是使用errors包中的New函式

2、使用Errorf給錯誤新增更多資訊
    使用fmt包中的Errorf函式,會根據格式說明符,規定錯誤的格式,並返回一個符合該錯誤的字串

3、使用結構體型別和欄位提供錯誤的更多資訊
     錯誤可以用實現了error介面的結構體表示

4、使用結構體型別的方法來提供錯誤的更多資訊複製程式碼

三十二:panic和recover

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

使用反射編寫清晰和可維護的程式碼是十分困難的,應儘可能避免使用複製程式碼


相關文章