【记录一个问题】golang神坑,明明返回了接口指针类型的nil值,却无法用if判断

先看看导致异常的代码:

package main

import (
    "fmt"
    "log"
)

type MyError1 struct{
    MyErrorCode int
    msg string
    lastError error
}

func (e *MyError1)Error()string{
    return fmt.Sprintf("code=%d", e.MyErrorCode)
}

func f11()(int32, error){
    return 1, nil
}

func f33()(string, *MyError1){
    return "", nil
}

func main() {
    a, err := f11()
    log.Println(a, err)
    b, err := f33()  //这里err的类型已经不是原来的类型了
    if err!=nil{  //上一个函数已经返回了nil,但是这里却没办法用if判断
        log.Println("xxxx", err)
        log.Println(err.Error())  //调用nil的.Error()方法,导致崩溃
    }
    log.Println(b, err)
}

经yif同学介绍,搜索了这篇帖子来学习:golang interface判断为空nil

把代码修改成以下,问题解决:

方法1

package main

import (
    "fmt"
    "log"
    "reflect"
)

type MyError1 struct{
    MyErrorCode int
    msg string
    lastError error
}

func (e *MyError1)Error()string{
    return fmt.Sprintf("code=%d", e.MyErrorCode)
}

func f11()(int32, error){
    return 1, nil
}

func f33()(string, *MyError1){
    return "", nil
}

func IsNil(i interface{}) bool {
    vi := reflect.ValueOf(i)
    if vi.Kind() == reflect.Ptr {
        return vi.IsNil()
    }
    return false
}

func main() {
    a, err := f11()
    log.Println(a, err)
    b, err := f33()
    if !IsNil(err){
        log.Println("xxxx", err)
        log.Println(err.Error())
    }
    log.Println(b, err)
}

方法2

package main

import (
    "fmt"
    "log"
)

type MyError1 struct{
    MyErrorCode int
    msg string
    lastError error
}

func (e *MyError1)Error()string{
    return fmt.Sprintf("code=%d", e.MyErrorCode)
}

func f11()(int32, error){
    return 1, nil
}

func f33()(string, *MyError1){
    return "", nil
}

func main() {
    a, err := f11()
    log.Println(a, err)
    b, myErr := f33()
    if myErr!=nil {
        log.Println("xxxx", myErr)
        log.Println(myErr.Error())
    }
    log.Println(b, myErr)
}

原文地址:https://www.cnblogs.com/ahfuzhang/p/12925446.html