golang nil 不等于 nil的问题

golang nil 不等于 nil的问题,第1张

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

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(或者其他类型接口并且实现对应的接口方法) 接收 自定义结构体

即一般不会出现这种问题

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/993899.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存