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。

 



posted @   TonyZhang24  阅读(234)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示