Go中的interface的两大用法

Go中的interface的两大用法

interface = 方法的集合 ,是一套规范 / 约定。

只要一个类型实现了接口里的所有方法 ,它就自动实现了这个接口。

go 复制代码
// 动物interface
type Animal interface {
    Eat() 
    Run()
}

// 猫结构体
type Cat struct {
    Name string
}

func (c Cat) Eat() {
    fmt.Println(c.Name, "吃鱼")
}

func (c Cat) Run() {
    fmt.Println(c.Name, "快跑")
}

// 狗结构体
type Dog struct {
    Name string
}

func (d Dog) Eat() {
    fmt.Println(d.Name, "啃骨头")
}

func (d Dog) Run() {
    fmt.Println(d.Name, "狂奔")
}

Cat 和 Dog 都实现了 Animal 接口的全部方法 ,它们都是 Animal 类型。

基本用法

go 复制代码
func main() {
    // 定义接口变量
    var animal Animal

    // 把 Cat 赋值给接口
    animal = Cat{Name: "小猫"}
    animal.Eat() // 小猫 吃鱼
    animal.Run() // 小猫 快跑

    // 把 Dog 赋值给接口
    animal = Dog{Name: "小狗"}
    animal.Eat() // 小狗 啃骨头
    animal.Run() // 小狗 狂奔
}

泛型的通用效果

go 复制代码
// 参数是 Animal 接口:能接收所有实现了 Animal 的类型
func MyFun(a Animal) {
    a.Eat()
}

func main() {
    miao := Cat{Name: "小白"}
    wang := Dog{Name: "旺财"}
    MyFun(miao) // 小白 吃鱼
    MyFun(wang) // 旺财 啃骨头
}

解耦合 : 谁都不依赖谁

现在我实现了一个第三方模块(itsdk),你不能改源码
go 复制代码
package itsdk

// 第三方只给你一个接口:定规矩
type PayChannel interface {
    Pay(amount int) string
}

// 第三方提供的功能:必须传 PayChannel 才能用
func StartPay(p PayChannel) {
    result := p.Pay(100)
    println(result)
}
  • 只依赖一个接口 PayChannel
  • 不关心你的任何代码
我的代码
go 复制代码
package main

import (
	"itsdk"   // 引入第三方
	"strconv" // "字符串" 与 "基本数据类型" 转换的核心工具包
)

// 自己定义结构体
type MyPay struct{}

// PayChannel 目前只有 Pay 一个方法;
// 只要实现 Pay ,MyPay 就是PayChannel 类型
func (m MyPay) Pay(amount int) string {
    return "支付结果:" + strconv.Itoa(amount)
}

func main() {
    a := MyPay{}
    itsdk.StartPay(a) 
    // 支付结果:100
}
  • 通过实现了 Pay 方法,MyPay 成为 PayChannel 类型;
  • 这样才能正常使用StartPay方法!

必须实现第三方给的接口,才能调用功能;

保证了你没遵守规矩,我不让你用我的函数

空接口 interface {}(万能类型)

go 复制代码
// 能接收任何类型
func PrintAny(v interface{}) {
    fmt.Println(v)
}

func main() {
    PrintAny(100) // 100
    PrintAny("hello") // hello
    PrintAny(Cat{Name: "小猫"}) // 小猫 吃鱼
}

感谢🙏

视频大佬讲解两大用法【golang教学】第十章:golang的接口interface介绍和工作中的使用(1010工作室出品)~

想要了解什么是interface请移步到接口 | Golang 中文学习文档~

相关推荐
码事漫谈5 小时前
黄仁勋被裁第一天,就收到了橄榄枝
后端
金銀銅鐵5 小时前
带您看懂字节码指令(二):空循环里有什么
java·后端·ai编程
§ꦿCFོ༉6 小时前
嵌入式八股文—C语言入门学习(四)
c语言·开发语言·学习
投图匠6 小时前
十种不同风格的 CTP接口 框架
开发语言·python
皮皮林5517 小时前
比 Xshell 还好用的 SSH 客户端神器,MobaXterm 太爱了!
后端
我不会起名字3228 小时前
会话缓存失效排查:区分 Redis 失效与节点广播
redis·后端·go·即时通讯·im·故障排查
深入云栈9 小时前
Netty 4.2.x 源码深度解析 (二十三):ByteBuf 核心设计 —— 索引、类型与零拷贝
java·后端·架构
JackJiang9 小时前
IM踩坑:聊天消息ID怎么设计?一个UUID搞不定,我用双ID解决
后端·架构
开心猴爷9 小时前
iOS 上架 App 流程
后端·ios
爱笑的k1110 小时前
nano-vllm 源码剖析:千行 Python 手写离线推理引擎的调度、显存与并行时序
开发语言·python·vllm