美文网首页
理解interface和nil

理解interface和nil

作者: bysir | 来源:发表于2018-03-25 00:28 被阅读0次

判断一下以下代码会打印什么?

package main

import (
    "fmt"
)

type MyError struct{}

func (e *MyError ) Error() string {
  return "a"
}



func main() {
    var a *MyError
    if a == nil {
        fmt.Println("a == nil")
    } else {
        fmt.Println("a != nil")
    }
    fmt.Println("a Error():", a.Error())

    var b error = a
    if b == nil {
        fmt.Println("b == nil")
    } else {
        fmt.Println("b != nil")
    }
    fmt.Println("b Error():", b.Error())
}

.
.
.
.
.
.
.
.
.
.
.
.

会打印出

a == nil
a Error(): a
b != nil
b Error(): a

和你预期是否一致呢? 试着理解一下这个问题.

---- 分割线 ----

在底层,interface作为两个成员实现:一个类型和一个值。该值被称为接口的动态值, 它是一个任意的具体值,而该接口的类型则为该值的类型。对于 int 值3, 一个接口值示意性地包含(int, 3)。

只有在内部值和类型都未设置时(nil, nil),一个接口的值才为 nil。

在以上代码中b存储的是(*MyError, nil), 因此,b是非 nil 的,即使在该指针的内部值为 nil。

实践

此问题并不出现在面试题中, 在日常封装接口(大多是自定义error才会用==nil的判断)时, 就要注意此问题, 如下面两种写法:

type MyError struct{}

func (e *MyError ) Error() string {
  return "a"
}
// good
func NewError(msg string) error{
  if (msg==""){
    return nil
  }
  return &MyError{}
}

// bad
func NewError(msg string) *MyError{
  if (msg==""){
    return nil
  }
  return &MyError{}
}

其中bad写法就会导致err == nil 为false

var err error
err = NewError("")
print(err == nil) // false

参考

相关文章

  • 理解interface和nil

    判断一下以下代码会打印什么? ............ 会打印出 和你预期是否一致呢? 试着理解一下这个问题. -...

  • nil interface 坑

    nil interface 和 nil interface 值虽然 interface 看起来像指针类型,但它不是...

  • golang里interface空指针

    interface空指针不为nil 当把一个空指针对象赋值给一个interface后, 这个不难理解,因为i = ...

  • golang问题interface和nil

    interface和nil 上菜代码 对比代码 问题描述第一种情况:编译没有报错,可以执行,但是不能输入。第二种情...

  • interface==nit?

    package main /*interface 与 nil 的比较一个interface{}类型的变量包含了2个...

  • 判断interface 为nil

    interface 由(type,data) 组成,用下面的IsNil方法 判断,不能直接 == nil outp...

  • nil、Nil、NULL、NSNull

    nil nil 是 ObjC 对象的字面空值,对应 id 类型的对象,或者使用 @interface 声明的 Ob...

  • 记录一个golang的问题

    这里可以看到tmp 不等于nil, tmp本身是一个interface{} ,内部data为nil.留待后续研究...

  • nil、Nil、NULL和NSNull的理解

    其实早就想研究一下nil、Nil、NULL和NSNull之间的区别,只是工作上除了nil,其它的几乎少有用到,所以...

  • golang中的nil与空接口

    而指针,函数,interface,slice,channel和map的零值都是nil可以看看下面代码的例子。 ni...

网友评论

      本文标题:理解interface和nil

      本文链接:https://www.haomeiwen.com/subject/zzhpqftx.html