先看看导致异常的代码:

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)
}

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

  1. 【记录一个问题】神坑,自定义一个golang的error类型,居然运行崩溃了

    2020-05-20 18:20补充: 感谢yif同学提供指导,出现错误并且打印大量信息的原因是函数递归调用导致栈溢出. 而导致递归调用的关键代码是%v 类型实现了error的interface %v ...

  2. 一个有关Golang变量作用域的坑

    转自:http://tonybai.com/2015/01/13/a-hole-about-variable-scope-in-golang/ 临近下班前编写和调试一段Golang代码,但运行结果始终 ...

  3. Entity Framework 6 Recipes 2nd Edition(11-6)译 -> 从一个”模型定义”函数里返回一个复杂类型

    11-6.从一个”模型定义”函数里返回一个复杂类型 问题 想要从一个”模型定义”函数返回一个复杂类型 解决方案 假设我们有一个病人(patient)和他们访客(visit)的模型,如 Figure 1 ...

  4. 记录一个bootstrap惨痛的错误

    记录一个bootstrap的错误,这个错误因为我删除了一个class就导致了页面上显示的错误,这是一个惨痛的教训,特此记录,提醒自己在做前端的修改时,一定要慎之又慎.如果真的要做改动,改完之后也要测一 ...

  5. step_by_step_记录一个javascript字符串处理问题

    记录一个javascript字符串处理的问题 这一天下班,技术QQ群里的大神提出了一个问题,带着问题去思考. ? '---9890.999008-555555-55555555----' 对于这样的字 ...

  6. /编写一个函数,要求从给定的向量A中删除元素值在x到y之间的所有元素(向量要求各个元素之间不能有间断), 函数原型为int del(int A ,int n , int x , int y),其中n为输入向量的维数,返回值为删除元素后的维数

    /** * @author:(LiberHome) * @date:Created in 2019/2/28 19:39 * @description: * @version:$ */ /* 编写一个 ...

  7. 【Android】7.0 Intent向下一个活动传递数据、返回数据给上一个活动

    1.0 可以利用Intent吧数据传递给上一个活动,新建一个叫“hellotest01”的项目. 新建活动FirstActivity,勾选“Generate Layout File”和“Launche ...

  8. 判断是否是同一人的方法——equals()?在Person类中提供一个比较的方法compare()返回boolean值?对象自己和自己比?

    判断是否是同一人的方法——equals() 不能直接用per1==per2,这不是对象内容的比较而是存放对象地址的值得比较 在Person类中提供一个比较的方法compare()返回boolean值 ...

  9. typeof操作符返回一个字符串,表示未经计算的操作数的类型。

    typeof操作符返回一个字符串,表示未经计算的操作数的类型.   语法 typeof运算符后跟操作数: typeof operand or typeof (operand) 参数 operand 是 ...

随机推荐

  1. django的Cookie Session

    Cookie 初识cookie的设置和获取 示例 from django.shortcuts import render, redirect from django.shortcuts import ...

  2. JAVA获取访问者的内网IP地址

    /** * 获取访问者内网IP * @return the server ip */ public static String getIntranetIp() { // 本地IP,如果没有配置外网IP ...

  3. 【九度OJ】题目1193:矩阵转置 解题报告

    [九度OJ]题目1193:矩阵转置 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1193 题目描述: 输入一个N*N的矩阵,将其转置 ...

  4. 【LeetCode】713. Subarray Product Less Than K 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/subarray ...

  5. 【LeetCode】438. Find All Anagrams in a String 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 滑动窗口 双指针 日期 题目地址:https://l ...

  6. 【LeetCode】529. Minesweeper 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS 日期 题目地址:https://leetco ...

  7. 【LeetCode】468. Validate IP Address 解题报告(Python)

    [LeetCode]468. Validate IP Address 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: h ...

  8. 1119 机器人走方格 V2

    1119 机器人走方格 V2 基准时间限制:1 秒 空间限制:131072 KB M * N的方格,一个机器人从左上走到右下,只能向右或向下走.有多少种不同的走法?由于方法数量可能很大,只需要输出Mo ...

  9. RabbitMQ,RocketMQ,Kafka 事务性,消息丢失和消息重复发送的处理策略

    消息队列常见问题处理 分布式事务 什么是分布式事务 常见的分布式事务解决方案 基于 MQ 实现的分布式事务 本地消息表-最终一致性 MQ事务-最终一致性 RocketMQ中如何处理事务 Kafka中如 ...

  10. [c++]关于指针的一些问题记录

    const char* 和char* 之间的转换 const char*是指向常量的指针,而不是指针本身为常量,可以不被初始化.该指针可以指向常量也可以指向变量,只是从该指针的角度而言,它所指向的是常 ...