Golang中的Interface可以被看作是一个Wrapper,它是一个包含了value
和type
的二元祖。从一定层面来说,它的作用有点像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。所以在它上面调用法不会报错。