beego中判断sql查询错误是否等于ErrNoRows

68 阅读1分钟

beego中的判断数据库的查询结果是否为空,可以使用db查询返回结果中的err是否等于 orm.ErrNoRows?

这种是怎么实现的?

error类型比较应该是比较指针地址的,怎么可能有两个error一样呢?或许是error的新特性。

	err1 := errors.New("<hello> error")
	err2 := errors.New("<hello> error")
	fmt.Println(err1 == err2)

输出:false

果然不是error的新特性。那么ErrNoRows的相等是怎么实现的呢?

// C:/Users/Administrator/go/pkg/mod/github.com/astaxie/beego@v1.11.1/orm/orm.go:81
var	ErrNoRows        = errors.New("<QuerySeter> no row found")

或许是orm的查询结果直接返回全局变量-ErrNoRows。 就可以判断err是否等于ErrNoRows。那么这种错误的判断是如何实现的?

// C:/Users/Administrator/go/pkg/mod/github.com/astaxie/beego@v1.11.1/orm/orm_queryset.go:218
func (o *querySet) One(container interface{}, cols ...string) error {
	o.limit = 1
	num, err := o.orm.alias.DbBaser.ReadBatch(o.orm.db, o, o.mi, o.cond, container, o.orm.alias.TZ, cols)
	if err != nil {
		return err
	}
	if num == 0 {
		return ErrNoRows
	}

	if num > 1 {
		return ErrMultiRows
	}
	return nil
}

这里就是很明显的证据,返回了全局变量ErrNoRows。