Go语言中interface的两大用法详解

 更新时间:2026年05月21日 09:16:59   作者:我叫黑大帅  
文章主要介绍了Go语言中interface的两大用法:一是作为方法的集合,定义了一套规范/约定;二是泛型的通用效果解耦合,谁都不依赖谁,还详细解释了空接口interface{}(万能类型)的应用场景,最后强调了必须实现第三方给的接口,才能调用其功能

在 Go 语言中,interface 是一组方法的集合,它定义了一种行为规范,但不提供实现。任何类型只要实现了接口中定义的所有方法,就隐式地实现了该接口。这是 Go 实现多态和灵活设计的基础。

为什么需要 interface

interface 让你能够编写更通用、更松耦合的代码。例如,你希望一个函数可以接受多种不同类型的参数,只要它们都能“说话”,就可以定义一个 Speaker 接口,然后让不同的类型实现它。这样函数就不需要针对每种具体类型写一份代码。

interface的基本语法

type 接口名 interface {
    方法名1(参数列表) 返回值列表
    方法名2(参数列表) 返回值列表
    // ...
}

示例:

type Writer interface {
    Write(data []byte) (int, error)
}
type Stringer interface {
    String() string
}

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: "小猫"}) // 小猫 吃鱼
}

最佳实践与常见陷阱

1.接口应小而专:遵循“只做一件事”的原则。标准库中的 io.Readerio.Writer 都是经典例子。

2.接收者类型一致性:一个类型的方法集包括值接收者和指针接收者,但接口变量能否接受该类型取决于你传递的是值还是指针。

  • 如果实现方法用的是 func (t T) Method(),那么 T 和 *T 都实现了接口。
  • 如果实现方法用的是 func (t *T) Method(),那么只有 *T 实现了接口。

3.nil 与 nil 接口:永远不要返回具体类型的 nil 指针作为 error 接口,请直接 return nil

4.尽量使用小的接口:大接口难以实现,也会降低复用性。

5.接受接口,返回结构体:函数参数使用接口提高灵活性,返回值通常使用具体类型,避免过早抽象。

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

相关文章

  • Go来合并两个csv的实现示例

    Go来合并两个csv的实现示例

    本文主要介绍了Go来合并两个csv的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • Golang中gin框架绑定解析json数据的两种方法

    Golang中gin框架绑定解析json数据的两种方法

    本文介绍 Golang 的 gin 框架接收json数据并解析的2种方法,文中通过代码示例介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2023-12-12
  • golang 结构体初始化时赋值格式介绍

    golang 结构体初始化时赋值格式介绍

    这篇文章主要介绍了golang 结构体初始化时赋值格式介绍,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 浅析Golang中的协程(goroutine)

    浅析Golang中的协程(goroutine)

    在Go语言中,协程(goroutine)是轻量级的线程,它是Go语言中实现并发编程的基础,Go语言中的协程是由Go运行时调度器(scheduler)进行管理和调度的,本文将给大家简单的介绍一下Golang中的协程,需要的朋友可以参考下
    2023-05-05
  • 详解Go语言Slice作为函数参数的使用

    详解Go语言Slice作为函数参数的使用

    Slice切片在Go语言中实质是一种结构体类型,本文详细的介绍了Go语言Slice作为函数参数的使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • Go语言panic和recover的用法实例

    Go语言panic和recover的用法实例

    panic()和recover()是Go语言中用于处理错误的两个重要函数,本文主要介绍了Go语言panic和recover的用法实例,panic()用于中止程序并引发panic,而recover()用于捕获panic并恢复程序的执行,感兴趣的可以了解一下
    2024-01-01
  • Goland 生成可执行文件的操作

    Goland 生成可执行文件的操作

    这篇文章主要介绍了Goland 生成可执行文件的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • golang中GOPROXY如何设置

    golang中GOPROXY如何设置

    在Go语言开发中,合理设置 GOPROXY 环境变量可以显著提升依赖包的下载速度和稳定性,针对高级场景,可以配置多代理冗余、禁止代理访问特定包或关闭校验和验证,下面就来详细的介绍一下
    2026-02-02
  • golang使用mTLS实现双向加密认证http通信

    golang使用mTLS实现双向加密认证http通信

    这篇文章主要为大家介绍了golang如何调用mTLS实现双向加密认证http通信,文中的示例代码讲解详细,具有一定的学习价值,需要的小伙伴可以参考下
    2023-08-08
  • Go使用defer函数要注意的几个点

    Go使用defer函数要注意的几个点

    这篇文章主要介绍了Go使用defer函数要注意的几个点,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12

最新评论