关于Golang中的Interface的nil

Golang中的Interface可以被看作是一个Wrapper,它是一个包含了valuetype的二元祖。从一定层面来说,它的作用有点像Java中的范型,可以包含任何的值和类型,只要这个类型实现了接口所定义的方法即可。

当声明了一个interface的变量而没有赋值,那么它的值就是nil,这时候如果调用它上面的方法,就会报runtime error。

type I interface {
  M()
}

var i I
i.M() // runtime error

如果给interface变量赋值了一个具体的类型的变量,即使这个变量本身是nil,它(interface变量)也不再是nil了,那么就可以调用它上面的方法了。

type I interface {
  M()
}

type Integer int

func (integer *Integer) M() {
  //...
}

func main() {
  var i I
  var myInt *Integer  // myInt = nil
  i = myInt
  i.M()  // no error would be reported
}

所以,与其他编程语言(Java)一样,在nil上调用方法,Golang一样会报错。只是interface是一个Wrapper,只要它包含了哪怕是一个nil的变量,这个interface也不是nil。所以在它上面调用法不会报错。

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