Golang 接口
基本介绍
interface类型可以定义一组方法,但是这些不需要实现。并且interface不能包含任何变量,到某个自定义类型要使用的时候,在根据具体情况把这些方法写出来。
基本语法
type 接口名 interface{ method1(参数列表) 返回值列表 method2(参数列表) 凡是值列表 ... }
实现接口说有方法:
fun (t 自定义类型) method1 (参数列表) 返回值列表{ //方法实现 } func (t 自定义类型) method2(参数列表) 返回值列表{ //方法实现 }
说明:
1) 接口里的所有方法都没有方法体,即接口的方法都是没有实现的方法。接口体现了程序设计的多态和高内聚低耦合的思想
2)Golang中的接口,不需要显示的实现。只要一个变量,含有接口类型中的所有方法,那么这个变量就实现这个接口。因此,Golang中没有implement这样的关键字
注意事项和细节
1)接口本身不能创建实例,但是可以指向一个实现了该接口的自定义类型的变量(实例)
2)接口中说有的方法都没有方法体,即都是没有实现的方法
3)在Golang中,一个自定义类型需要将某个接口的所有方法都实现,我们说这个自定义类型实现了该接口
4)一个自定义类型只有实现了某个接口,才能将该自定义类型的实例(变量)赋给接口类型
5)只要是自定义数据类型,就可以实现接口,不仅仅是结构类型
6)一个自定义类型可以实现多个接口
7)Golang接口中不能有任何变量
8)一个接口(比如A接口)可以继承多个别的接口(比如B,C接口),这时如果要实现A接口,也必须将B,C接口的方法也全部实现
9)interface类型默认是一个指针,如果没有对interface初始化就使用,那么会输出nil
10)空接口interface{}没有任何方法,所以说有类型都实现了空接口
接口和继承的比较
package main import( "fmt" ) //定义一个猴子Monkey结构体 type Monkey struct{ Name string } //声明一个鸟类的接口 type BirdAble interface{ Flying() } //声明一个鱼类的接口 type FishAble interface{ Swimming() } //定义一个Monkey结构体的方法 func (this *Monkey) climbing(){ fmt.Println(this.Name,"生来会爬树...") } //定义一个小猴子的结构体 type LittleMonkey struct{ Monkey//继承 猴子结构体 } //让LittleMonkey实现BirdAble func (this *LittleMonkey) Flying(){ fmt.Println(this.Name,"通过学习,会飞翔...") } //让LittleMonkey实现FishAble func (this *LittleMonkey) Swimming(){ fmt.Println(this.Name,"通过学习,会游泳...") } func main(){ monkey :=LittleMonkey{ Monkey{ Name: "悟空", }, } monkey.climbing() monkey.Flying() monkey.Swimming() }
说明:
1)当A结构体继承了B结构体,那么A结构体就自动的继承了B结构体的字段和方法,并且可以直接使用。
2)当A结构体需要扩展功能,同时不希望去破坏继承关系,则可以去实现某个接口即可,因此我们可以认为:实现接口时对继承机制的补充。
实现接口VS继承
1) 接口和继承解决的问题不同
继承的价值主要在于:解决代码的复用性和可维护性
接口的价值主要在于:设计,设计好各种规范,让其它自定义类型去实现这些方法
2)接口比继承更加灵活
接口比继承更加灵活,继承时满足 is--a的关系,而接口只需要满足 like-a的关系
3)接口在一定程度上实现代码解耦
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!