关于interface{}

#Golang

编译下列代码,哪些行会出现编译错误 ``` package main type Books struct { } func foo1(x interface{}) { } func foo2(x *interface{}) { } func main() { s := Books{} p := &s foo1(s) //line:1 foo2(s) //line:2 foo1(p) //line:3 foo2(p) //line:4 } ``` 编译提示line2,line4出错,*interface {} is pointer to interface, not interface 即指向接口的指针不是接口 怎么理解呢,空接口可以是任意类型,当然可以是指针,所以line1,3是没有问题的 最终在[stackoverflow](https://stackoverflow.com/questions/44370277/type-is-pointer-to-interface-not-interface-confusion)上找到了答案 接口保持了传入值的指针和类型,本身相当于指针了 s呢?是一个Book类型,Book实现了空接口(他还有可能实现其他接口), 但Book不是空接口啊,这时传入foo2(s),便会提示s不是空接口指针类型 同样的,p是指向Book的指针,并不是指向接口的指针,故也无法编译 Golang接口是一个方法集,实现了其全部方法的类型即实现了此接口,但接口和普通类型仍有区别 如: ``` type Books interface { foo() } type book struct{ name string } func (b book)foo(){ // 方式1 } func (b *book)foo(){ // 方式2 } ``` 方式1可以实现Books接口,但无法修改其内部变量,换言之,b是值传递 方式2也实现了Books接口,但是为指针传递传递,使用中会隐式进行指针类型转换 即: 方式1可用(book).foo() 方式2可用(*book1).foo() , (book).foo()

上一篇