Go中interface的两大用法

 更新时间:2026年03月17日 10:01:31   作者:我叫黑大帅  
本文主要介绍了Go中interface的两大用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

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

// 动物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 类型。

基本用法

func main() {
    // 定义接口变量
    var animal Animal

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

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

泛型的通用效果

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

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

解耦合 : 谁都不依赖谁

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

package itsdk

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

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

我的代码

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 {}(万能类型)

// 能接收任何类型
func PrintAny(v interface{}) {
    fmt.Println(v)
}

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

到此这篇关于Go中interface的两大用法的文章就介绍到这了,更多相关Go interface用法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go语言学习之new函数的用法详解

    Go语言学习之new函数的用法详解

    这篇文章主要为大家详细介绍了Go语言中new()函数的相关知识以及具体用法,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以了解一下
    2023-05-05
  • golang如何实现抓取IP地址的蜘蛛程序详解

    golang如何实现抓取IP地址的蜘蛛程序详解

    这篇文章主要给大家介绍了关于利用golang如何实现抓取IP地址的蜘蛛程序的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-07-07
  • 详解Go语言中Goroutine退出机制的原理及使用

    详解Go语言中Goroutine退出机制的原理及使用

    goroutine是Go语言提供的语言级别的轻量级线程,在我们需要使用并发时,我们只需要通过 go 关键字来开启 goroutine 即可。本文就来详细讲讲Goroutine退出机制的原理及使用,感兴趣的可以了解一下
    2022-07-07
  • 详解Golang中strconv库的用法

    详解Golang中strconv库的用法

    strconv包提供了字符串和基本数据类型之间的相互转换功能,本文将带大家深入了解Go语言标准库中的strconv包,掌握其常用的函数和用法,希望对大家有所帮助
    2023-06-06
  • go语言reflect.Type 和 reflect.Value 应用示例详解

    go语言reflect.Type 和 reflect.Value 应用示例详解

    这篇文章主要为大家介绍了go语言reflect.Type 和 reflect.Value 应用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • Go 结构化日志slog入门与实战指南 附避坑秘籍

    Go 结构化日志slog入门与实战指南 附避坑秘籍

    Go 1.21终于带来了官方结构化日志log/slog,本文将带你从零上手 slog,并通过几个小例子展示它如何让日志变得更结构化、可查询、可维护,感兴趣的朋友跟随小编一起看看吧
    2026-02-02
  • golang1.23版本之前 Timer Reset方法无法正确使用

    golang1.23版本之前 Timer Reset方法无法正确使用

    在Go 1.23之前,使用`time.Reset`函数时需要先调用`Stop`并明确从timer的channel中抽取出东西,以避免潜在的问题,然而,这在实际代码中难以实现,因为设置定时器状态和发送channel的操作并不是原子的,在某些情况下,这会导致timer在不应该触发时提前触发
    2025-01-01
  • Go语言带缓冲的通道的使用

    Go语言带缓冲的通道的使用

    Go语言中有缓冲的通道是一种在被接收前能存储一个或者多个值的通道,本文就来介绍一下Go语言带缓冲的通道的使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • goalng 结构体 方法集 接口实例详解

    goalng 结构体 方法集 接口实例详解

    这篇文章主要为大家介绍了goalng 结构体 方法集 接口实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-09-09
  • go实现限流功能示例

    go实现限流功能示例

    这篇文章主要为大家介绍了go实现限流功能示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08

最新评论