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
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 7,925评论 2 9
  • interface是go语言定义的一种类型,通常用于定义一些方法的集合。但是在go语言里面,interface又与...
    程屁凹阅读 4,298评论 0 0
  • 最近在油管上面看了一个视频:Understanding nil,挺有意思,这篇文章就对视频做一个归纳总结,代码示例...
    天唯阅读 54,160评论 8 77
  • 戒指的三视图练习好久了 一直没有上色 看似简单的小戒指 我认为是珠宝里面比较难画的 或许是因为自己不是美术生的缘故...
    四姑娘Sisi阅读 4,001评论 0 7
  • 自上周把自己今年的目标定位在学习和关系上,本周就加强了对时间管理的学习,利用开车上下班的时间听易效能,读《小强升职...
    后知早觉阅读 1,644评论 0 0