golang nil 不等于 nil的问题

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

type MyselfError struct{}

func (m *MyselfError) Error() string {
 return "实现 error 接口的 Error 方法"
}

func someWork() *MyselfError {
 return nil
}

func main() {
 var err error
 err = 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).Error
	if err != nil {
		w.log.Errorf("通过id获取用户信息失败:%v", err)
		return nil, v1.ErrorUnknownError("%v", "获取用户信息失败")
	}
	return
}

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

// DB GORM DB definition
type DB struct {
	*Config
	Error        error
	RowsAffected int64
	Statement    *Statement
	clone        int
}

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

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

接口的测试

ackage main

import (
	"fmt"
)


func main() {
	var err error
	var err2 interface{}
	err = nil
	fmt.Println(err == nil)
	fmt.Println(err2 == nil)
	fmt.Println(err == err2)
}

//true
//true
//true

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

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

即一般不会出现这种问题

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值