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
1
xrlin 2018-01-26 13:30:58 +08:00 5
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 |
2
noobsheldon 2018-01-26 13:31:09 +08:00
|
3
heimeil 2018-01-26 13:47:51 +08:00 via Android
interface 做比较的时候不只比较值还需要比较类型。
第一个 if 是 nil == nil 第二个 if 是 ( *interface{}, nil ) == ( nil, nil ) |
5
rrfeng 2018-01-26 14:38:47 +08:00 via Android
没看一楼之前我都没懂代码里写的啥...
|
7
zzutmebwd 2018-01-26 15:31:24 +08:00
建议不要起这种标题,没意思。
|
8
MooneyChu 2018-01-26 15:53:22 +08:00
建议不要起这种标题,没意思。哈哈哈,虽然我看不懂代码
|