go陷阱之 nil的interface 与 nil的interface值

go 的 interfaces{} 不是一个指针,虽然它看起来像指针。
当interface{} 它的类型和值都为nil的时候,这个值才 ==nil
请看下面这段程序

package main
import "fmt"
func main() {  
    var data *byte
    var in interface{}
    fmt.Println(data,data == nil) //prints: <nil> true
    fmt.Println(in,in == nil)     //prints: <nil> true
    in = data
    fmt.Println(in,in == nil)     //prints: <nil> false
    //'data' is 'nil', but 'in' is not 'nil'
}

上面那个是示例。
下面是在开发中可能遇到的问题
错误示范:

import "fmt"
func main() {  
    doit := func(arg int) interface{} {
        var result *struct{} = nil
        if(arg > 0) {
            result = &struct{}{}
        }
        return result
    }
    if res := doit(-1); res != nil {
        fmt.Println("good result:",res) //prints: good result: <nil>
        //'res' is not 'nil', but its value is 'nil'
    }
}

正确示范:

package main
import "fmt"

func main() {  
    doit := func(arg int) interface{} {
        var result *struct{} = nil
        if(arg > 0) {
            result = &struct{}{}
        } else {
            return nil //return an explicit 'nil'
        }
        return result
    }
    if res := doit(-1); res != nil {
        fmt.Println("good result:",res)
    } else {
        fmt.Println("bad result (res is nil)") //here as expected
    }
}

又看到一段错误用例

func Foo() error {
    var err *os.PathError = nil
    // …
    return err
}

func main() {
    err := Foo()
    fmt.Println(err)        // <nil>
    fmt.Println(err == nil) // false
}

转载于:https://www.jianshu.com/p/cc111876ac83

猜你喜欢

转载自blog.csdn.net/weixin_34124939/article/details/91131200