1 回答
TA贡献2065条经验 获得超13个赞
接口值确实是可比较的,但是您只能比较可相互赋值的值(更准确地说,一个是可赋值给另一个的)。引用自规范:比较运算符:
在任何比较中,第一个操作数必须可分配给第二个操作数的类型,反之亦然。
您不能error
为 an 赋值io.Reader
,也不能io.Reader
为 an 赋值error
,因此无法比较它们。
它们可能存储也可能不存储相同的动态值,如果你想比较它们,首先将两者都隐藏到interface{}
,这样你就可以比较它们,例如:
fmt.Println(interface{}(err) == interface{}(reader))
这将输出(在Go Playground上尝试):
true
注意:实际上只将其中一个转换为 就足够了interface{}
,因为这样另一个值将与您转换为的值的类型相当interface{}
(任何值都可以转换为interface{}
),所以这样做也足够了:
fmt.Println(interface{}(err) == reader)
测试与非接口值的比较nil
:
type x int
func (x) Error() string { return "" }
func (x) Read([]byte) (int, error) { return 0, nil }
err = x(0)
reader = x(0)
fmt.Println(interface{}(err) == interface{}(reader))
reader = x(1)
fmt.Println(interface{}(err) == interface{}(reader))
现在输出将是(在Go Playground上尝试):
true false
也不要忘记nil
接口值不等于nil
持有nil
动态值的非接口值。
编辑:
包fmt
打印接口内的值,而不是接口值。引用包文档fmt
:
无论动词如何,如果操作数是接口值,则使用内部具体值,而不是接口本身。
同样适用于reflect.TypeOf()
:它返回动态类型,但如果您将nil
接口值传递给它,它会返回nil
,因此fmt
包将打印nil
。引用它的文档:
TypeOf 返回表示 i 的动态类型的反射类型。如果 i 是 nil 接口值,则 TypeOf 返回 nil。
- 1 回答
- 0 关注
- 108 浏览
添加回答
举报