Go - interface
在go语言中,也有接口的定义。但是和其他语言不同的是,go语言的接口比较“特殊”。。。
定义
接口是一个或者多个方法签名的集合,它之后方法的定义,没有方法的实现,也不能在其中定义字段。
// interface.go package main import ( "fmt" ) type IUSB interface { GetName() string Connect() } func main() { fmt.Println("Hello World!") }
实现接口
在go语言中,通过定义类型来实现接口。实现接口的时候,无需显示指定实现了那个接口(这与其他语言不同),只需要定义出所需实现接口的所有方法即可。我们成这种方式为(Structural typing).
// interface.go package main import ( "fmt" ) type IUSB interface { GetName() string Connect() } type CellPhoneUSB struct { Name string } func (cp CellPhoneUSB) GetName() string { return cp.Name } func (cp CellPhoneUSB) Connect() { fmt.Println("cell phone connected...", cp.Name) } func main() { var a IUSB a = CellPhoneUSB{"myCellPhone"} a.Connect() }
我们先看下输出结果:
可以看到,我们定义了一个类型是CellPhoneUSB,它实现了IUSB中的两个方法GetName()和Connect().
在main函数里面,我们定义了一个变量a,它的类型是接口IUSB,然后我们将a转换成为一个type(CellPhoneUSB),在此之后,我们调用了类型CellPhoneUSB的connect方法。
接口嵌套
当我们需要将明确接口的层次结构的时候,就需要使用接口的嵌套。例如
type Connector interface { Connect() } type IUSB interface { GetName() string Connector }
类型判断
有时候,由于我们实现的类型是实现了某种嵌套的接口,这时就需要我们进行类型判断。 闲话少说,上code
// interface.go package main import ( "fmt" ) type Connector interface { Connect() } type IUSB interface { GetName() string Connector } type CellPhoneUSB struct { Name string } func (cp CellPhoneUSB) GetName() string { return cp.Name } func (cp CellPhoneUSB) Connect() { fmt.Println("cell phone connected...", cp.Name) } func Disconnect(connector Connector) { if pc, ok := connector.(CellPhoneUSB); ok { fmt.Println("disconnected ...", pc.Name) } fmt.Println("type unknown!") } func main() { var a IUSB a = CellPhoneUSB{"myCellPhone"} a.Connect() Disconnect(a) }
我们定义了一个Disconnect的方法,在其中需要判断是否为指定的类型(CellPhoneUSB), 这里使用了表达式语句
if pc, ok := connector.(CellPhoneUSB); ok {
...
}
:= 的右边是 -> 类型实例.(期望类型)
空接口与type-switch
go语言允许我们使用空接口来模拟类似object类型的类型。此时,判断类型实现了那个接口就稍显复杂。不过我们可以用type-swtich语句来处理。
func GetType(obj interface{}) { switch result := obj.(type) { case CellPhoneUSB: fmt.Println("It is a cell phone usb", result.Name) default: fmt.Println("Unknown type...") } }
使用接口的规则
1. 调用接口传入对象时,无论怎样定义,都是对象的 copy, 因此,无法改变原对象。
2. 只有当接口存储的类型和对象都为nil时,接口才等于nil。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现