看了煎鱼的博客有一段代码是这样的
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条)