15分钟学 Go 第 18 天:接口

ops/2024/10/27 22:05:19/

第18天:接口

欢迎来到Go语言学习的第18天,今天我们将深入探讨接口(interface)这一重要概念。接口是Go语言中实现多态性的核心机制之一,能够帮助我们编写灵活且高效的代码。下面将详细介绍接口的定义、使用场景、示例代码及其运行流程。

学习目标

  • 理解Go语言中的接口概念。
  • 掌握接口的定义与实现。
  • 学习如何利用接口实现多态。
  • 通过示例深入理解接口的实际应用。

1. 接口的定义

在Go语言中,接口是一组方法签名的集合。任何类型只要实现了接口中所有方法,就满足该接口。接口本身并不包含数据或实现,而是指定了一组方法的集合。

接口的语法

接口的基本定义语法如下:

type InterfaceName interface {MethodName1(parameters) returnTypeMethodName2(parameters) returnType
}

示例:定义一个Speaker接口

type Speaker interface {Speak() string
}

这个接口定义了一个名为Speak的方法。


2. 接口的实现

任何类型只要实现接口中定义的所有方法,就可以被视为该接口的实现。值得注意的是,Go语言不需要显式声明某种类型实现了哪个接口,只要实现了相应的方法即可。

示例:实现Speaker接口

type Person struct {Name string
}func (p Person) Speak() string {return "Hello, my name is " + p.Name
}type Dog struct {Name string
}func (d Dog) Speak() string {return "Woof! My name is " + d.Name
}

3. 使用接口

接口可以用于函数参数、返回值以及结构体字段中,从而为代码的灵活性和可扩展性提供支持。

示例:使用接口作为参数

func MakeSound(s Speaker) {fmt.Println(s.Speak())
}func main() {person := Person{Name: "Alice"}dog := Dog{Name: "Buddy"}MakeSound(person) // 输出: Hello, my name is AliceMakeSound(dog)    // 输出: Woof! My name is Buddy
}

在上述代码中,MakeSound函数可以接受任何实现Speaker接口的对象,实现了多态。


4. 接口的零值与类型断言

4.1 接口的零值

接口的零值为nil,如果你创建一个接口变量但没有赋值,它的默认值就是nil。对nil接口调用方法将导致运行时错误。

示例:接口的零值

var s Speaker
fmt.Println(s == nil) // 输出: true
// fmt.Println(s.Speak()) // 会引发运行时错误

4.2 类型断言

类型断言是一种将接口变量转换为具体类型的方法,可以检查接口中存储的值的具体类型。

语法:
value, ok := interfaceVariable.(Type)

示例:使用类型断言

func Describe(s Speaker) {switch v := s.(type) {case Person:fmt.Println("I am a Person, Name:", v.Name)case Dog:fmt.Println("I am a Dog, Name:", v.Name)default:fmt.Println("Unknown type")}
}

5. 接口的嵌套与组合

Go语言允许接口嵌套,通过组合多个接口来形成一个新的接口,这样可以构建更复杂的行为。

示例:定义嵌套接口

type Animal interface {Speak() string
}type Walker interface {Walk() string
}type Pet interface {AnimalWalker
}type Cat struct {Name string
}func (c Cat) Speak() string {return "Meow! My name is " + c.Name
}func (c Cat) Walk() string {return c.Name + " is walking."
}

6. 接口和多态

多态是面向对象编程(OOP)中的一个重要概念。通过接口实现多态,可以让不同类型的对象以相同的方式进行处理。

示例:多态应用

func PerformAction(p Pet) {fmt.Println(p.Speak())fmt.Println(p.Walk())
}func main() {cat := Cat{Name: "Whiskers"}PerformAction(cat)
}

运行流程图

以下是完整代码运行的流程图:

+------------------+
|    main()        |
| +-------------+  |
| | Cat         |  |
| | Name: "Whiskers" |  
| +-------------+  |
|         |        |
|         +--------> PerformAction(Pet)
|                  |
|                  +---> p.Speak()     (Cat.Speak)
|                  |        |
|                  |        +--> 输出: Meow! My name is Whiskers
|                  |
|                  +---> p.Walk()      (Cat.Walk)
|                           |
|                           +--> 输出: Whiskers is walking.
+------------------+

7. 小结

今天我们详细探讨了Go语言中的接口概念,学习了接口的定义、实现,以及多态的应用。接口为我们提供了灵活的编程方式,使代码更加简洁和容易维护。

练习

  1. 定义一个Shape接口,包含一个方法Area(),然后实现该接口的CircleRectangle类型。
  2. 创建一个DisplayShape函数,接受Shape类型的参数,并打印出该形状的面积。

参考资料

  • Go语言官方文档
  • Go by Example
  • Effective Go

怎么样今天的内容还满意吗?再次感谢观众老爷的观看,关注GZH:凡人的AI工具箱,回复666,送您价值199的AI大礼包。最后,祝您早日实现财务自由,还请给个赞,谢谢!


http://www.ppmy.cn/ops/128917.html

相关文章

单目相机标定

利用ROS的Camera Calibration工具进行USB单目相机标定 标定前准备的东西编译运行标定代码移动棋盘格标定结果总结单目相机标定参考网址 标定前准备的东西 1.大型棋盘格:具有已知尺寸的棋盘格。本教程使用的是一个8x6的棋盘格,方格边长为108毫米。标定时使用棋盘格的内部顶点…

如何借助通达信API构建自动化交易系统?

炒股自动化:申请官方API接口,散户也可以 python炒股自动化(0),申请券商API接口 python炒股自动化(1),量化交易接口区别 Python炒股自动化(2):获取…

AndroidStudio Koala更改jdk版本 2024-1-2

升级android studio版本到 AndroidStudio Koala之后,发现修改jdk版本的方式不同了。如下: 修改jdk版本

data_table_2 与 flutter 官方 DataTable 的区别

data_table_2 与 flutter 官方 DataTable 的区别 https://blog.csdn.net/ken2232/article/details/143181634 flutter 数据表增强库 data_table_2 错误问题 记录 (****) https://blog.csdn.net/ken2232/article/details/143180018 data_table_2 与 flutter 官方 DataT…

Python 判断键是否存在字典中(新手入门、实战案例)

在早期的Python2版本中,可以使用 dict.has_key()方法来判断一个键是否存在于字典中。 在Python3中,dict.has_key()方法被废弃了,不能再被使用。如果在Python3中尝试使用dict.has_key()方法会导致 AttributeError异常。 那在Python3中要如何判…

基于rk356x u-boot版本功能分析及编译相关(二)

🎏技术驱动源于热爱,祝各位学有所成。 文章目录 build.sh脚本分析make.sh编译脚本分析接上,rk3568的u-boot编译在 基于rk356x u-boot版本功能分析及编译相关(一)已有描述,下面针对编译脚本进行分析,在编译之前都进行了哪些工作。 build.sh脚本分析 在编译目录下执行…

【LLM之Agent】《Tool Learning with Large Language Models: A Survey》论文阅读笔记

概述 背景信息 近年来,基于大型语言模型(LLMs)的工具学习成为增强LLMs应对复杂任务能力的有力范式。尽管这一领域快速发展,现有文献的碎片化以及缺乏系统组织,给新入门者带来了阻碍。因此,本论文旨在对现…

详解STL之 hash table — 超绝“常数平均时间”效率

1.hash table 概述 哈希(hash)又称散列,是一种组织数据的方式。从译名来看,有散乱排列的意思。本质就是通过哈希 函数把关键字Key跟存储位置建立一个映射关系,查找时通过这个哈希函数计算出Key存储的位置,进行快速查找。 hash tab…