golang nil 不等于 nil的问题
看了煎鱼的博客有一段代码是这样的
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的问题相关推荐
- 理解golang中什么是nil
nil是什么 // nil is a predeclared identifier representing the zero value for a // pointer, channel, fun ...
- 学习笔记-nil NULL NSNull Nil的区别
nil--表示实例对象为空 例如 NSString * string = nil; NSArray * arr ...
- Go中error类型的nil值和nil
https://my.oschina.net/chai2010/blog/117923 转载于:https://www.cnblogs.com/answercard/p/8658722.html
- Go语言实践[回顾]教程21--详解Go语言的空值、零值、nil
Go语言实践[回顾]教程21--详解Go语言的空值.零值.nil Go 语言中 零值.空值.nil 概念之我见 基本数据类型的零值 复合数据类型的空值 通过实例体验零值.空值 nil 的差别 nil ...
- GoLang 单元测试打桩和 mock
目录 什么是 mock 变量打桩 接口方法/Redis 函数/方法打桩 包函数 成员方法 MySQL sqlmock sqlite mock gorm http mock 源码地址 单测基础 什么是 ...
- 看看这篇拯救发际线的干货吧--警惕 Go 编程陷阱
在2019年08月17日举办的 Gopher Meetup(深圳站)活动上,来自 Bindo Labs 公司的李雄飞进行了 <Go 编程陷阱>的演讲.李雄飞,Bindo Labs 后端技术 ...
- golang 面试题(十三)interface内部结构和nil详解
1.以下代码打印出来什么内容,说出为什么. package mainimport ("fmt" )type People interface {Show() }type Stude ...
- 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 } 初学者很多 ...
- golang中string不能为nil
golang中不能用nil初始化string package mainfunc main() {var s strings = nil } 运行报错:cannot use nil as type st ...
最新文章
- Michael Jordan:人工智能研究的目标变了,不再是构建单个智能
- android webview重绘,Android-怎么判断android中WebView滑动到了低端
- 如何抓住重点,系统高效地学习数据结构与算法?
- 5分钟盗走你的隐私照片,这个全球性漏洞到底有多可怕
- DVWA File Inclusion——Writeup
- 第一个MVVM wp7程序
- TreeView的checked事件
- Leaning perl 第2章练习题答案
- macos无法验证此app不包含恶意软件_macOS 平台的一款后门样本(TinyTim)的分析
- QUnit 5分钟教程
- Java实习生的一天
- LinkedHashMap倒叙反转
- 一位用贞操换取欲望的仙女
- spark Hash Shuffle内幕彻底解密
- MySQL死锁问题如何分析锁表后查看死锁和去除死锁快速解决方法
- 商人过河c语言编程,商人过河问题C语言源码.c
- android pak文件_xpak是什么文件 怎么安装xapk文件 和apk有什么区别
- linux脚本量产,可玩性很高的量产键盘、套件 HEAVY SHELL KIRA 96简单上手
- 2018.5.11作业
- 私有RTP协议和标准流媒体协议
热门文章
- python读取log文件生成图形表_python提取log文件内容并画出图表
- [蓝桥杯][2019年第十届真题c/c++B组]迷宫(寻找路径bfs及文件输入输出)
- linux 如何解压.exe,linux下解压火狐浏览器压缩包 ./filefox 运行可执行程序报错问题...
- 金蝶k3rpc服务器不可用_金蝶KIS商贸版常见问题这样解决
- python selenium 处理弹窗_转:python selenium 弹出框处理的实现
- 类对象作为函数参数进行值传递
- 用C#完成Swift远程推送通知
- WebStorm 8.0.3下简单运行pomelo项目
- GNU make manual 翻译( 一百一十一)
- 客户端用mstsc不能用一台设备连接终端服务器的解决办法