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)
    }
    
    
  • 相关阅读:
    java数组
    python中的换行与不换行
    金融业务知识2---资金的时间价值与跨时期优化
    金融业务知识1---金融和金融系统
    你真的理解正向代理和反向代理吗?
    webpack(9)plugin插件功能的使用
    webpack(8)vue组件化开发的演变过程
    webpack(7)webpack使用vue配置
    webpack(6)webpack处理图片
    webpack(5)webpack处理css文件
  • 原文地址:https://www.cnblogs.com/ahfuzhang/p/12925446.html
Copyright © 2011-2022 走看看