先看看导致异常的代码:

  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. )
  6. type MyError1 struct{
  7. MyErrorCode int
  8. msg string
  9. lastError error
  10. }
  11. func (e *MyError1)Error()string{
  12. return fmt.Sprintf("code=%d", e.MyErrorCode)
  13. }
  14. func f11()(int32, error){
  15. return 1, nil
  16. }
  17. func f33()(string, *MyError1){
  18. return "", nil
  19. }
  20. func main() {
  21. a, err := f11()
  22. log.Println(a, err)
  23. b, err := f33() //这里err的类型已经不是原来的类型了
  24. if err!=nil{ //上一个函数已经返回了nil,但是这里却没办法用if判断
  25. log.Println("xxxx", err)
  26. log.Println(err.Error()) //调用nil的.Error()方法,导致崩溃
  27. }
  28. log.Println(b, err)
  29. }

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

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

方法1

  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "reflect"
  6. )
  7. type MyError1 struct{
  8. MyErrorCode int
  9. msg string
  10. lastError error
  11. }
  12. func (e *MyError1)Error()string{
  13. return fmt.Sprintf("code=%d", e.MyErrorCode)
  14. }
  15. func f11()(int32, error){
  16. return 1, nil
  17. }
  18. func f33()(string, *MyError1){
  19. return "", nil
  20. }
  21. func IsNil(i interface{}) bool {
  22. vi := reflect.ValueOf(i)
  23. if vi.Kind() == reflect.Ptr {
  24. return vi.IsNil()
  25. }
  26. return false
  27. }
  28. func main() {
  29. a, err := f11()
  30. log.Println(a, err)
  31. b, err := f33()
  32. if !IsNil(err){
  33. log.Println("xxxx", err)
  34. log.Println(err.Error())
  35. }
  36. log.Println(b, err)
  37. }

方法2

  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. )
  6. type MyError1 struct{
  7. MyErrorCode int
  8. msg string
  9. lastError error
  10. }
  11. func (e *MyError1)Error()string{
  12. return fmt.Sprintf("code=%d", e.MyErrorCode)
  13. }
  14. func f11()(int32, error){
  15. return 1, nil
  16. }
  17. func f33()(string, *MyError1){
  18. return "", nil
  19. }
  20. func main() {
  21. a, err := f11()
  22. log.Println(a, err)
  23. b, myErr := f33()
  24. if myErr!=nil {
  25. log.Println("xxxx", myErr)
  26. log.Println(myErr.Error())
  27. }
  28. log.Println(b, myErr)
  29. }

【记录一个问题】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. CF1145F Neat Words 题解

    Content 本题为 CF 愚人节比赛题目. 给定一个长度为 \(n\) 的,仅包含大写字母的字符串,问这个字符串里面的字母是否全部都是由仅有直线的字母组成,或者全部都是由有曲线的字母构成. 数据范 ...

  2. LuoguP7369 [COCI2018-2019#4] Elder 题解

    Content 有一个魔杖最初在 \(Z\) 巫师中.经过 \(n\) 轮较量,第 \(i\) 轮中,\(Z_{i,1}\) 巫师打败了 \(Z_{i,2}\) 巫师.如果一个巫师打败了拥有魔杖的巫师 ...

  3. 网络路径排查工具使用/原理浅析(MTR、traceroute、tracepath、windows下besttrace)

    在请求网络资源获取缓慢或者有丢包过程中.经常会使用到网络路径探测工具.linux 下最常用的有mtr.traceroute.tracepath 等. 你是否有一点疑惑,路径探测的原理到底是如何完成的, ...

  4. Mysql中不能update自身的解决方法

    不能执行:update bi_data.order_all_detailset err_msg='同时存在于wx,zfb平台',proc_time=now()where order_no in( se ...

  5. .NET 云原生架构师训练营(对象过程建模)--学习笔记

    目录 UML OPM OPM优化 UML 1997年发布UML标准 主要域 视图 图 主要概念 结构 静态视图 类图 类.关联.泛化.依赖关系.实现.接口 用例视图 用例图 用例.参与者.关联.扩展. ...

  6. Redis报错:RDB snapshots, but it is currently not able to persist on disk 处理

    Response received : -MISCONF Redis is configured to save RDB snapshots, but it is currently not able ...

  7. 【LeetCode】581. Shortest Unsorted Continuous Subarray 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 方法一:排序比较 日期 题目地址:https://leetco ...

  8. 【剑指Offer】二叉树的镜像 解题报告(Python)

    [剑指Offer]二叉树的镜像 解题报告(Python) 标签(空格分隔): LeetCode 题目地址:https://www.nowcoder.com/ta/coding-interviews 题 ...

  9. 洛谷 P1434 [SHOI2002]滑雪(DP,记忆化搜索)

    题目描述 Michael喜欢滑雪.这并不奇怪,因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道在一个区域中最长 ...

  10. mysql多条件过滤查询之mysq高级查询

    一.什么是高级查询: ① 多条件的过滤查询 简单说,即拼接sql语句,在sql查询语句之后使用: where 条件1 and/or 条件2 and/or 条件3 - ② 分页查询 二.多条件过滤查询: ...