我还是有点晕,老司机求带漂移

2018-01-26 12:07:45 +08:00
 rwdy2008

关于接口 nil 比较的问题,还是没吃透,有大神帮忙解释解释下面的代码吗?为什么一个 nil 一个非 nil

        var a = (*interface{})(nil)
	fmt.Println(reflect.TypeOf(a), reflect.ValueOf(a))
	if a == nil {
		fmt.Printf("a is nil\n")
	}else {
		fmt.Printf("a is not nil\n")
	}

	var val interface{} = (*interface{})(nil)
	fmt.Println(reflect.TypeOf(val), reflect.ValueOf(val))
	if val == nil {
		fmt.Println("val is nil")
	} else {
		fmt.Println("val is not nil")
	}

output

*interface {} <nil>
a is nil
*interface {} <nil>
val is not nil
2368 次点击
所在节点    Go 编程语言
9 条回复
xrlin
2018-01-26 13:30:58 +08:00
Golang 中 interface 由(type, value)两部分组成
1、对于比较运算符(==), 在 interface 类型( i )和非 interface 类型( ni )比较时,在 i 中的 value 与 ni 的类型相同且 i 的 value 与 ni 的 value 相等时判断为 true。
2、在 interface 与 nil 比较时,需要 interface 的 type,value 皆为 nil 时,==运算符返回 true。

对于:
var a = (*interface{})(nil) // a 的类型为*interface{}
var b interface{} = (*interface{})(nil) // b 的类型为 interface{}, 其中 type =*interface{}, value=nil
a == nil // a 为非 interface 类型,a 的值为 nil,返回 true
b == nil // b 的 type 不为 nil,返回 false
a == b // b 的 type 与 a 的类型相同,值相同,返回 true

其中 reflece.Typeof 对于接口类型,返回 interface 的 type, 对于非 interface 类型,返回其类型


详情可看 golang spec。
https://golang.org/ref/spec#Comparison_operators
noobsheldon
2018-01-26 13:31:09 +08:00
heimeil
2018-01-26 13:47:51 +08:00
interface 做比较的时候不只比较值还需要比较类型。

第一个 if 是 nil == nil
第二个 if 是 ( *interface{}, nil ) == ( nil, nil )
rwdy2008
2018-01-26 13:56:10 +08:00
@xrlin 清晰明了,终于明白了,感谢
rrfeng
2018-01-26 14:38:47 +08:00
没看一楼之前我都没懂代码里写的啥...
aksoft
2018-01-26 15:30:43 +08:00
@rrfeng 这就是 golang 的特色。。
zzutmebwd
2018-01-26 15:31:24 +08:00
建议不要起这种标题,没意思。
MooneyChu
2018-01-26 15:53:22 +08:00
建议不要起这种标题,没意思。哈哈哈,虽然我看不懂代码
zonghua
2018-01-27 15:25:33 +08:00
@xrlin 这么复杂的东西都能掌握表示很钦佩。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/426113

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX