Go:接口一些特性
最近在刷题的时候,注意到接口的一些特性。
空接口的作用
在调用一些库函数的时候,经常会注意到函数参数里面会带有一个空接口,但是实际调用的时候却可以传别的类型进去。后面查的资料,才发现:
- 接口在go里面的实现是隐式的,也就是说只要是实现了
所有
接口里面定义的方法,那么就可以认为实现了接口 - 上面一条说了实现接口的条件,但是注意需要知道是
结构体
才能实现接口。也就是说函数的实现必须要有接收者,才会认为这个函数是接口的实现,不然的话只是一个普通的方法 - 既然接口有了实现的主体和实现的条件,那么空接口的作用也就出来了:空接口没有定义任何方法的接口类型。因此任何类型都可以视为实现了空接口。也正是因为空接口类型的这个特性,空接口类型的变量可以存储任意类型的值。
- 当然在一些内建函数的参数上面,我们会发现参数是
any
,但实际上点进去查看源码,发现其实就是type的空接口:
- 空接口既然可以储存任意类型的值,实际作用肯定不止函数参数这一个地方,比如map的value:
map[string]interface{}
接口的实现
上面讲到了只要结构体实现的条件,正常来说结构体直接实现接口的方法即可。但是,我也发现一些比较骚的实现也可以实现接口,比如:组合结构体、结构体继承。
// WashingMachine 洗衣机 type WashingMachine interface { wash() dry() } // 甩干器 type dryer struct{} // 实现WashingMachine接口的dry()方法 func (d dryer) dry() { fmt.Println("甩一甩") } // 海尔洗衣机 type haier struct { dryer //======嵌入甩干器结构体,变相的实现了接口的dry方法============= } // 实现WashingMachine接口的wash()方法 func (h haier) wash() { fmt.Println("洗刷刷") }
同样还是上面的例子,但是这次用结构体的继承也可以变相实现接口的所有方法:
// WashingMachine 洗衣机 type WashingMachine interface { wash() dry() } // 甩干器 type dryer struct{} // 实现WashingMachine接口的dry()方法 func (d dryer) dry() { fmt.Println("甩一甩") } // 海尔洗衣机 type haier struct { *dryer //=======嵌入甩干器,继承dryer变相实现dry方法========== } // 实现WashingMachine接口的wash()方法 func (h haier) wash() { fmt.Println("洗刷刷") }
接口变量
正如标题,接口可以作为一个变量,然后对他进行赋值操作。
// WashingMachine 洗衣机 type WashingMachine interface { wash() } // 甩干器 type dryer struct{} // 实现WashingMachine接口的dry()方法 func (d dryer) dry() { fmt.Println("甩一甩") } func main(){ var w WashingMachine d := dryer{} w = d //接口变量调用dryer结构体实现的接口方法 w.dry() }
另外一个类似的应用就是在函数参数里面:
//接口作为函数参数 func runWash(w WashingMachine) { fmt.Println("run wash func") } func main(){ d := dryer{} //只要是实现了WashingMachine接口的都可以传参进去,如果还有另外的什么结构体a、b什么的都可以传!!! runWash(d) }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· Qt个人项目总结 —— MySQL数据库查询与断言
2022-06-26 centos7输入rz命令后出现receive.**B0100000023be50,没有文件弹出框