看了煎鱼的博客有一段代码是这样的

type MyselfError struct{}func (m *MyselfError) Error() string {return "实现 error 接口的 Error 方法"
}func someWork() *MyselfError {return nil
}func main() {var err errorerr = someWork()fmt.Println(err == nil)
}// output: false

这个是为何?

我们正常情况会这么使用,而不是用error类型取接收

type MyselfError struct{}func (m *MyselfError) Error() string {return "实现 error 接口的 Error 方法"
}func someWork() *MyselfError {return nil
}func main() {var myselfError MyselfError myselfError = someWork()fmt.Println(myselfError == nil)
}

这个让我有点疑惑,那岂不是,gorm的.Error方法返回与nil做比较也是不可靠的,比如:

func (w *WechatUserRepo) GetWechatUserById(id int64) (wechatUser *model.WechatUser, err error) {err = w.data.db.Where("id = ? ", id).Limit(1).Find(&wechatUser).Errorif err != nil {w.log.Errorf("通过id获取用户信息失败:%v", err)return nil, v1.ErrorUnknownError("%v", "获取用户信息失败")}return
}

其实这里是没有问题的,gorm .Error方法返回值类型为error接口类型

// DB GORM DB definition
type DB struct {*ConfigError        errorRowsAffected int64Statement    *Statementclone        int
}

如果error没有被赋值为对应的错误值,则动态类型与实际类型都是nil

下面是尝试了一些interface的问题,接口类型初始类型的动态类型与动态值都是nil故可以与nil比较,error也是一个interface类型,试试具有一个自己的方法

接口的测试

ackage mainimport ("fmt"
)func main() {var err errorvar err2 interface{}err = nilfmt.Println(err == nil)fmt.Println(err2 == nil)fmt.Println(err == err2)
}//true
//true
//true

所以上面的例子可以归纳为:

这种情况 必须满足两种特殊条件:
1.自定义结构体 实现了error接口(或者其他类型接口并且实现对应的接口方法)
2.用 err(或者其他类型接口并且实现对应的接口方法) 接收 自定义结构体

即一般不会出现这种问题

golang nil 不等于 nil的问题相关推荐

  1. 理解golang中什么是nil

    nil是什么 // nil is a predeclared identifier representing the zero value for a // pointer, channel, fun ...

  2. 学习笔记-nil NULL NSNull Nil的区别

    nil--表示实例对象为空  例如  NSString * string = nil;                                            NSArray * arr ...

  3. Go中error类型的nil值和nil

    https://my.oschina.net/chai2010/blog/117923 转载于:https://www.cnblogs.com/answercard/p/8658722.html

  4. Go语言实践[回顾]教程21--详解Go语言的空值、零值、nil

    Go语言实践[回顾]教程21--详解Go语言的空值.零值.nil Go 语言中 零值.空值.nil 概念之我见 基本数据类型的零值 复合数据类型的空值 通过实例体验零值.空值 nil 的差别 nil ...

  5. GoLang 单元测试打桩和 mock

    目录 什么是 mock 变量打桩 接口方法/Redis 函数/方法打桩 包函数 成员方法 MySQL sqlmock sqlite mock gorm http mock 源码地址 单测基础 什么是 ...

  6. 看看这篇拯救发际线的干货吧--警惕 Go 编程陷阱

    在2019年08月17日举办的 Gopher Meetup(深圳站)活动上,来自 Bindo Labs 公司的李雄飞进行了 <Go 编程陷阱>的演讲.李雄飞,Bindo Labs 后端技术 ...

  7. golang 面试题(十三)interface内部结构和nil详解

    1.以下代码打印出来什么内容,说出为什么. package mainimport ("fmt" )type People interface {Show() }type Stude ...

  8. golang defer 关闭文件 报错file may have nil or other unexpected value as its corresponding error

    错误实例: file, err := os.Open("xxx.txt") defer file.Close() if err != nil {return err } 初学者很多 ...

  9. golang中string不能为nil

    golang中不能用nil初始化string package mainfunc main() {var s strings = nil } 运行报错:cannot use nil as type st ...

最新文章

  1. Michael Jordan:人工智能研究的目标变了,不再是构建单个智能
  2. android webview重绘,Android-怎么判断android中WebView滑动到了低端
  3. 如何抓住重点,系统高效地学习数据结构与算法?
  4. 5分钟盗走你的隐私照片,这个全球性漏洞到底有多可怕
  5. DVWA File Inclusion——Writeup
  6. 第一个MVVM wp7程序
  7. TreeView的checked事件
  8. Leaning perl 第2章练习题答案
  9. macos无法验证此app不包含恶意软件_macOS 平台的一款后门样本(TinyTim)的分析
  10. QUnit 5分钟教程
  11. Java实习生的一天
  12. LinkedHashMap倒叙反转
  13. 一位用贞操换取欲望的仙女
  14. spark Hash Shuffle内幕彻底解密
  15. MySQL死锁问题如何分析锁表后查看死锁和去除死锁快速解决方法
  16. 商人过河c语言编程,商人过河问题C语言源码.c
  17. android pak文件_xpak是什么文件 怎么安装xapk文件 和apk有什么区别
  18. linux脚本量产,可玩性很高的量产键盘、套件 HEAVY SHELL KIRA 96简单上手
  19. 2018.5.11作业
  20. 私有RTP协议和标准流媒体协议

热门文章

  1. python读取log文件生成图形表_python提取log文件内容并画出图表
  2. [蓝桥杯][2019年第十届真题c/c++B组]迷宫(寻找路径bfs及文件输入输出)
  3. linux 如何解压.exe,linux下解压火狐浏览器压缩包 ./filefox 运行可执行程序报错问题...
  4. 金蝶k3rpc服务器不可用_金蝶KIS商贸版常见问题这样解决
  5. python selenium 处理弹窗_转:python selenium 弹出框处理的实现
  6. 类对象作为函数参数进行值传递
  7. 用C#完成Swift远程推送通知
  8. WebStorm 8.0.3下简单运行pomelo项目
  9. GNU make manual 翻译( 一百一十一)
  10. 客户端用mstsc不能用一台设备连接终端服务器的解决办法