自定義錯誤型別時應該注意的 nil !=nil

夜幕下的風之發表於2020-09-02

看程式碼:

//自定義錯誤型別
type myError struct {
    msg string
}
//實現錯誤介面,即為錯誤
func (mye *myError) Error() string {
    return mye.msg
}
//自定義工廠類
//func NewMyError(checkFlag int) (err error) { //介面型別error定義返回值,接收時也是介面型別
func NewMyError(checkFlag int) (err *myError) {
    //err *myError 這樣定義返回值,在返回nil時,且用介面型別 error接收時
    // 判斷 err != nil 時永遠為true。因為介面型別(有值又有型別) error接收時,值為nil,但是型別T不為nil為myError,故不為nil。同時為nil時才時nil
    if checkFlag == 1 {
        return nil
    }
    err = &myError{"自定義錯誤!"}
    return
}
func main() {
    var err error //用介面型別 error接收
    err = NewMyError(1)
    if err != nil {
        fmt.Println("不為nil!!")
        fmt.Printf("%v\n",err)
    } else {
        fmt.Println("為nil!!")
    }
}

看看列印結果:
故:這種定義 ,一定要【返回值定義】和【接收型別】對應。不能定義返回值時用【本身結構體型別定義】,接收時用【介面型別定義】。需返回值定義什麼,接受對應什麼。ps:學廢了!!!

本作品採用《CC 協議》,轉載必須註明作者和本文連結
一切皆自學

相關文章