#1955·testify

v1.11.0 中的 assert.Empty 回归: 一个接口指针永远不会为空

作者: justinhwang创建于 2026年9月4日更新于 2026年9月4日
标签bug

□ 说明

IsEmpty'在 #1761中被重写(sert:使用反射的更快和更简单的是Empty). value.IsZero`,在v1.11.0中发布. 重写行为为旧执行处理过的一个形状: ** 指向接口**.

自v1.11.0起, " isEmpty " 将任何非无指针的 " 假指针 " 返回非无指针的接口,无论接口持有什么. 因此,Empty ' 永远不能通过Some Interface',而`NotEmpty ' 总是通过一个,即使被指针明确是空的。

根本原因,比较两个执行:

v1.1.0.0 (`装药/装药.go:717'):

开始 案例反映。 密码 : 如果 objValue. IsNil () { 返回真实 {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? deref:=objValue. Elem (). 互联网档案馆的存檔,存档日期2013-12-21. 接口 () / 通过接口重置框 {} 返回为Empty( delef)


v1.12.1 (`装药/装药.去:761'):

开始
func 为EmptyValue(objValue reflect). 数值) bol {
如果 objValue. IsZero () {
返回真实
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
切换objValue.Kind(){
案例反映。 陈,反省. 地图,反射。 切线:
返回 objValue.Len() ===0
案例反映。 密码 :
返回为EmptyValue(objValue.Elem())
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?
返回虚假
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

旧代码"objValue". 埃莱姆(. 界面() " 通过 " 界面 " 和 " 反映 " 进行圆通。 在结果上的"值"会使接口层倒塌,因此再现继续进入混凝土指针. 新的密码是反向的 价值直接,所以`objValue'。 Elem()在 QQI 上得出一个值,“ Kind() == 反映。 接口。 这种情况与开关中的任何病例都不符,因此 " 返回假 " 。

这看起来是无意的:#1761被设定为性能和简化变化,而就在它之前在#1753中添加的大量"Empty"-ness案例并不涵盖一个接口的指针.

□ 步入重现

自成一体,除作证外,没有依附关系:

开始 软件包重置

导入( E) "测试"

"GitHub.com/stretchr/测试/提供" (中文(简体) ).

类型形状接口{ 区域 () int }

平方结构{ 侧入

func (s *平方) 区域 () int {还原 s.Side * s.Side}

func TestEmpty PointerTo Interface(t *testing.T) { var s 形状 = & Square *%%

// 未包装的窗体在每个版本中都是空的. 主张。 空( t, square ) // 确定 主张。 空( t, & Square%%% ) // 确定 主张。 空 (t, s) // 确定

//v1.10.0:通过. v1.11.0+:失败. 主张。 空( t, & s) {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?

func TestNotEmpty PointerTo Interface(t *testing.T) { var 为空 = ""

//v1.10.0:失败,正确. v1.11.0+:通过. 主张。 非Empty( t, 空) (U) {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?


在v1.11.0+下,第一次测试失败,第二次通过;在v1.10.0下,完全相反. 持有`int'或`0'的任何人也一样。

□ 预期行为

`Empty'应透视界面层,透视指针的方式,以便`Empty'同意`Empty'。 具体地说,`即是即是即是即是即是即是即是即是即是即是即是即是即是即是即是即是即是即是即是即是即是即是即是即是即是即是即是即是即是即是即是即是即是即是即是即是即是即是即是即是即是即是即是. 界面的“反射”方式也是如此。 密码 :

开始
案例反映。 Ptr, 反射。 接口 :
返回为EmptyValue(objValue.Elem())

这还原了v1.1.0.0 . . . . . . .

内容来源: stretchr/testify