十二、Go语法进阶(接口和泛型)

Golang中文学习文档地址

1、接口

1.1 概念

  • 在 Go 语言中,接口是一种抽象类型,用于定义一组方法签名而不提供方法的实现。接口的核心理念是描述行为,而具体的行为实现由实现接口的类型提供。接口在 Go 语言中广泛用于实现多态性、松耦合和代码复用。

1.2 声明

go 复制代码
//声明一个接口类型,接口名为Person
type Person interface {
    //接口对外暴露两个方法
    Say(string) string
    Walk(int)
}

1.3 初始化

  • 所谓接口,仅仅定义了一组规范,所以单单接口是无法初始化的,没有具体的实现
go 复制代码
package main

import "fmt"

type Person interface {
	Name() string
	Age() int
}

func main() {
  //单接口无法初始化
  var p Person
  fmt.Println(p) //输出nil
}

1.4 接口的实现

  • 场景

    一家建筑公司,需要一台起重机,然后出了一份关于起重机的规范(接口),A公司接下了订单,根据建筑公司起重机的规范和自己的技术,造了起重机A(实现);后面建筑公司和A公司不合作,又找了个B公司,B公司也根据规范和自己的技术,造了起重机B(实现),其实建筑公司在使用起重机的方式和以前一样的。

  • go的接口实现示例

    go 复制代码
    package main
    
    import "fmt"
    
    //起重机接口,建筑公司定义的规范
    type Crane interface {
            JackUp() string
            Hoist() string
    }
    
    //起重机制造公司A
    type CraneA struct {
            name string
    }
    //公司A实现起重机规范
    func (c *CraneA) JackUp() string {
            return c.name + "======JackUp!!!!!"
    }
    //公司A实现起重机规范
    func (c *CraneA) Hoist() string {
            return c.name + "======hoist!!!!!"
    }
    
    //起重机制造公司B
    type CraneB struct {
            name string
            des  string
    }
    //公司B实现起重机规范
    func (c *CraneB) JackUp() string {
            return c.name + "======JackUp!!!!!使用" + c.des
    }
    //公司B实现起重机规范
    func (c *CraneB) Hoist() string {
            return c.name + "======hoist!!!!!使用" + c.des
    }
    
    //建筑公司
    type ConstructionCompany struct {
            name  string
            Crane Crane
    }
    
    //建筑公司改变起重机制造公司
    func (c *ConstructionCompany) changeCrane(crane Crane) {
            c.Crane = crane
    }
    
    func main() {
            cc := &ConstructionCompany{"建筑公司", &CraneA{"起重机A"}}
            fmt.Println(cc.Crane.JackUp())
            fmt.Println(cc.Crane.Hoist())
            cc.changeCrane(&CraneB{"起重机B", "B公司独家技术专利"})
            fmt.Println(cc.Crane.JackUp())
            fmt.Println(cc.Crane.Hoist())
    }
  • 在Go中接口的实现是隐式的,不用像Java使用implements关键字实现接口,只要结构体有接口定义的所有方法,就说明该结构体实现了该接口

1.5 空接口

go 复制代码
type Any interface{

}
  • Any接口内部没有方法集合,按实现的定义,所有的类型都是Any接口的实现,因为所有类型的方法集都是空集的超集,所以Any接口可以保存任何类型的值。
相关推荐
踏浪无痕7 小时前
高并发写入 API 设计:借鉴 NSQ 的内存队列与背压机制
后端·面试·go
技术不打烊8 小时前
Go并发陷阱避坑:RWMutex与Channel最佳实践
网络协议·go
用户89535603282201 天前
Goroutine + Channel 高效在哪?一文吃透 Go 并发底层 G-M-P 调度与实现
后端·go
王中阳Go2 天前
RAG的教程还是Python的丰富呀,咱们也想办法给Go生态做做贡献吧,哈哈。
go
没逻辑2 天前
Gopher 带你学并发计数器:从最快到最慢的性能之旅
后端·go
rafael(一只小鱼)2 天前
gemini使用+部署教程
java·人工智能·ai·go
free-dancer2 天前
【go之一】GMP模型
go
Java水解3 天前
GO语言特性介绍,看这一篇就够了!
后端·go
古城小栈3 天前
Gin 实现 大文件 分片上传 与 断点续传
go·gin
光头闪亮亮4 天前
Golang开发自动加载COM扫码枪进行一维码、二维码扫码与解码
go