十二、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接口可以保存任何类型的值。
相关推荐
cipher1 天前
用 Go 找预测市场的赚钱机会!
后端·go·web3
半枫荷1 天前
十一、Go语法基础(指针、结构体和方法)
go
gopyer2 天前
Go语言2D游戏开发入门004:零基础打造射击游戏《太空大战》3
golang·go·游戏开发
该用户已不存在2 天前
Golang 上传文件到 MinIO?别瞎折腾了,这 5 个库拿去用
前端·后端·go
华仔啊2 天前
Go 语言未来会取代 Java 吗?别争了,先看完这篇再说
java·后端·go
代码扳手3 天前
Golang 实战:用 Watermill 构建订单事件流系统,一文掌握概念与应用
后端·go
百锦再3 天前
Python、Java与Go:AI大模型时代的语言抉择
java·前端·vue.js·人工智能·python·go·1024程序员节
豆浆Whisky3 天前
掌握Go context:超越基础用法的正确实践模式|Go语言进阶(13)
后端·go