V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
rwdy2008
V2EX  ›  Go 编程语言

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

  •  
  •   rwdy2008 · 2018-01-26 12:07:45 +08:00 · 2521 次点击
    这是一个创建于 2501 天前的主题,其中的信息可能已经有所发展或是发生改变。

    关于接口 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
    
    9 条回复    2018-01-27 15:25:33 +08:00
    xrlin
        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
    noobsheldon
        2
    noobsheldon  
       2018-01-26 13:31:09 +08:00
    heimeil
        3
    heimeil  
       2018-01-26 13:47:51 +08:00 via Android
    interface 做比较的时候不只比较值还需要比较类型。

    第一个 if 是 nil == nil
    第二个 if 是 ( *interface{}, nil ) == ( nil, nil )
    rwdy2008
        4
    rwdy2008  
    OP
       2018-01-26 13:56:10 +08:00
    @xrlin 清晰明了,终于明白了,感谢
    rrfeng
        5
    rrfeng  
       2018-01-26 14:38:47 +08:00 via Android
    没看一楼之前我都没懂代码里写的啥...
    aksoft
        6
    aksoft  
       2018-01-26 15:30:43 +08:00
    @rrfeng 这就是 golang 的特色。。
    zzutmebwd
        7
    zzutmebwd  
       2018-01-26 15:31:24 +08:00
    建议不要起这种标题,没意思。
    MooneyChu
        8
    MooneyChu  
       2018-01-26 15:53:22 +08:00
    建议不要起这种标题,没意思。哈哈哈,虽然我看不懂代码
    zonghua
        9
    zonghua  
       2018-01-27 15:25:33 +08:00 via iPhone
    @xrlin 这么复杂的东西都能掌握表示很钦佩。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1068 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 23:14 · PVG 07:14 · LAX 15:14 · JFK 18:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.