
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 年 1 月 26 日 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 年 1 月 26 日 |
3 heimeil 2018 年 1 月 26 日 via Android interface 做比较的时候不只比较值还需要比较类型。 第一个 if 是 nil == nil 第二个 if 是 ( *interface{}, nil ) == ( nil, nil ) |
5 rrfeng 2018 年 1 月 26 日 via Android 没看一楼之前我都没懂代码里写的啥... |
7 zzutmebwd 2018 年 1 月 26 日 建议不要起这种标题,没意思。 |
8 MooneyChu 2018 年 1 月 26 日 建议不要起这种标题,没意思。哈哈哈,虽然我看不懂代码 |