十二、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 小时前
使用 Go + Gin + Fx 构建工程化后端服务模板(gin-app 实践)
前端·后端·go
lekami_兰12 小时前
MySQL 长事务:藏在业务里的性能 “隐形杀手”
数据库·mysql·go·长事务
却尘16 小时前
一篇小白也能看懂的 Go 字符串拼接 & Builder & cap 全家桶
后端·go
ん贤16 小时前
一次批量删除引发的死锁,最终我选择不加锁
数据库·安全·go·死锁
mtngt111 天前
AI DDD重构实践
go
Grassto3 天前
12 go.sum 是如何保证依赖安全的?校验机制源码解析
安全·golang·go·哈希算法·go module
Grassto4 天前
11 Go Module 缓存机制详解
开发语言·缓存·golang·go·go module
程序设计实验室5 天前
2025年的最后一天,分享我使用go语言开发的电子书转换工具网站
go
我的golang之路果然有问题5 天前
使用 Hugo + GitHub Pages + PaperMod 主题 + Obsidian 搭建开发博客
golang·go·github·博客·个人开发·个人博客·hugo
啊汉7 天前
古文观芷App搜索方案深度解析:打造极致性能的古文搜索引擎
go·软件随想