十二、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接口可以保存任何类型的值。
相关推荐
2601_9516457814 小时前
Linux 编程语言全解析:C、C++、Python、Go、Rust 谁更强?
linux·python·go·c·编程语言
踏着七彩祥云的小丑17 小时前
Go学习第5天:变量作用域 + 数组 + 指针
开发语言·学习·golang·go
唐青枫1 天前
别再把 struct 只当字段集合:Go 结构体从语法到项目实战
go
踏着七彩祥云的小丑2 天前
Go学习第4天:条件、循环语句+函数
学习·golang·go
tyung3 天前
Go 手写 Wait-Free SPSC 无界队列:无 CAS、无锁、泛型节点池
数据结构·后端·go
踏着七彩祥云的小丑3 天前
Go学习第3天:变量+常量+运算符
开发语言·学习·golang·go
踏着七彩祥云的小丑4 天前
Go学习第2天:程序结构+基础语法+数据类型
开发语言·学习·golang·go
吴佳浩4 天前
AI Infra 的真相:Go 没输,rust也不是取代
后端·rust·go
2601_959644895 天前
2026年权威AI引擎优化服务咨询,专业之选
go
逐光老顽童5 天前
用 Go 实现一个 LLM 路由网关:Thompson Sampling 与自适应故障转移实践
vue.js·go