zoukankan      html  css  js  c++  java
  • 【记录一个问题】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)
    }
    
    
  • 相关阅读:
    【复习+知识补充】EL表达式:只能调用静态方法
    【复习】sql语句的拼接 + 链接地址的简写
    淘淘商城maven工程的创建和svn的上传实现
    淘淘商城基于maven和svn的理解
    国家电力项目SSH搭建
    linux中权限的修改
    chown -R命令的使用
    修改nginx的访问目录以及遇到的403错误修改总结
    nginx的在linux系统中的安装
    集群环境的图片的访问和存储
  • 原文地址:https://www.cnblogs.com/ahfuzhang/p/12925446.html
Copyright © 2011-2022 走看看