栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Go语言

golang nil 不等于 nil的问题

Go语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

即一般不会出现这种问题

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/904689.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号