9.3 Go 接口的多态性


在这里插入图片描述
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
在这里插入图片描述

  • 推荐:「stormsha的主页」👈,持续学习,不断总结,共同进步,为了踏实,做好当下事儿~

  • 专栏导航

    • Python系列: Python面试题合集,剑指大厂
    • Git系列: Git操作技巧
    • GO系列: 记录博主学习GO语言的笔记,该笔记专栏尽量写的试用所有入门GO语言的初学者
    • 数据库系列: 详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 运维系列: 总结好用的命令,高效开发
    • 算法与数据结构系列: 总结数据结构和算法,不同类型针对性训练,提升编程思维

    非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

    💖The Start💖点点关注,收藏不迷路💖

    📒文章目录

      • 什么是接口?
      • 接口的多态性
        • 示例
      • 接口的空结构体
        • 空接口
      • 接口的类型断言
        • 示例
      • 接口的切片
        • 示例
      • 接口与错误处理
        • 示例
      • 接口与并发
        • 示例
      • 结论
      • 参考文章


内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容
Go 语言以其简洁、高效和安全的特点,在现代软件开发中占有一席之地。Go 语言的接口(interface)是实现多态性的关键机制之一,它允许不同类型的对象对同一消息做出响应。本文将深入探讨 Go 接口的多态性,并提供一些中高级的使用技巧,旨在帮助开发者更深入地理解和应用 Go 语言的接口特性。

什么是接口?

在 Go 语言中,接口是一种定义行为的类型,它不包含任何实现代码,只包含方法签名。一个接口可以被任何实现了这些方法的类型实现。这种特性使得接口成为实现多态性的完美工具。

接口的多态性

多态性是指允许不同类的对象对同一消息做出响应的能力,即同一个接口可以被不同的类实现。在 Go 中,这通过接口的实现来体现。当一个变量被声明为接口类型时,它可以存储任何实现了该接口的值。

示例

type Animal interface {MakeSound()
}type Dog struct {}
func (d Dog) MakeSound() { fmt.Println("Woof!") }type Cat struct {}
func (c Cat) MakeSound() { fmt.Println("Meow!") }func MakeAnimalSound(a Animal) {a.MakeSound()
}func main() {dog := Dog{}cat := Cat{}MakeAnimalSound(dog) // 输出: Woof!MakeAnimalSound(cat) // 输出: Meow!
}

接口的空结构体

Go 的接口底层是一个空的结构体,这意味着任何类型都可以被赋值给接口变量,只要它们实现了接口的方法。Go 编译器会自动检查类型是否实现了接口的所有方法。

空接口

空接口(empty interface)是没有任何方法的接口,任何类型都实现了空接口。

var i interface{}
i = "Hello World"
i = 42

接口的类型断言

类型断言是 Go 语言中检查接口变量所存储的具体类型的一种方式。它可以用来访问接口变量中的值,并将其转换为原始类型。

示例

func main() {var i interface{} = "Hello"s, ok := i.(string)if ok {fmt.Println(s) // 输出: Hello} else {fmt.Println("Not a string")}
}

接口的切片

接口切片是 Go 语言中非常强大的特性之一。由于接口的灵活性,你可以创建一个包含多种类型的切片,只要这些类型都实现了相同的接口。

示例

func main() {animals := []interface{}{Dog{}, Cat{}}for _, animal := range animals {animal.(Animal).MakeSound()}
}

接口与错误处理

Go 语言中的错误处理通常使用返回值来实现,但接口也可以用于更灵活的错误处理方式。

示例

type Errorable interface {Error() string
}func handleError(e Errorable) {if e != nil {fmt.Println(e.Error())}
}

接口与并发

Go 的并发模型基于 goroutines 和 channels。接口可以与并发编程结合使用,以实现更高级的并发控制。

示例

type Task interface {Execute() error
}func worker(task Task) {err := task.Execute()if err != nil {fmt.Println(err)}
}func main() {tasks := []Task{Task1{}, Task2{}}for _, task := range tasks {go worker(task)}
}

结论

Go 语言的接口提供了一种强大的方式来实现多态性。通过接口,开发者可以编写更灵活、更可扩展的代码。本文介绍了接口的基本概念、多态性、类型断言、切片、错误处理以及与并发编程的结合使用。

Go 基础目录:https://blog.csdn.net/sxc1414749109/article/details/137843832

参考文章

  1. 《Go语言圣经》
  2. Go by Example
  3. Effective Go

🔥🔥🔥道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

💖The End💖点点关注,收藏不迷路💖

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/25292.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Django 视图类

在Django框架中,视图类(Class-based views,简称CBVs)提供了一个面向对象的方式来定义视图。这种方式可以让你通过创建类来组织视图逻辑,而不是使用基于函数的视图(Function-based views,简称FBV…

详解FedAvg:联邦学习的开山之作

FedAvg:2017年 开山之作 论文地址:https://proceedings.mlr.press/v54/mcmahan17a/mcmahan17a.pdf 源码地址:https://github.com/shaoxiongji/federated-learning 针对的问题:移动设备中有大量的数据,但显然我们不能收…

minio的一个基础使用案例:用户头像上传

文章目录 一、minio下载安装(Windows)二、案例需求分析三、后端接口开发 一、minio下载安装(Windows) 1. 下载minio服务端和客户端 minio下载地址 2. 手动搭建目录 /minio/binmc.exeminio.exe/data/logs手动创建minio应用程序目…

vivado HW_DEVICE

硬件设备 描述 在Vivado Design Suite的硬件管理器功能中,每个硬件目标都可以 具有一个或多个Xilinx FPGA设备进行编程或用于调试目的。这个 hw_device对象是通过hw_server打开的hw_target上的物理部分。这个 current_hw_device命令指定或返回当前设备。 相关对象 硬…

Linux—小小内核升级

本篇主要是讲述下关于内核的一些基本常识,并记录下内核升级和编译的过程,若有遗漏/有误之处,望各位大佬们指出。 Ⅰ 基本内核常识 常见内核安装包 内核(kernel):这是Linux操作系统的核心部分,它负责管理系统的硬件和…

Vue3学习第二天记录

Vue3学习第二天记录 背景说明截图记录一个简单的JS文件Vue3的watch()函数Vue3的toRef()/toRefs()函数前端数据类型的分类前端写一个对外暴露的函数前端的...语法Vue3中watch()函数的总结Vue3中watchEffect()函数Vue3中watch()函数的坑Vue3中computed()函数 背景 最近在学习尚硅…

Vue2入门(安装Vue、devtools,创建Vue)以及MVVM分层思想

文章目录 1.下载并安装Vue2.使用Vue2.1 创建Vue以及挂载Vue2.2 模板语句的数据来源:data2.3 template配置项详解2.4 Vue实例和容器的关系 3.安装devtools4.MVVM分层思想5.通过vm可以访问哪些属性 1.下载并安装Vue (1)Vue是一个基于JavaScrip…

搭建高可用k8s

高可用只针对于api-server,需要用到nginx keepalived,nginx提供4层负载,keepalived提供vip(虚拟IP) 系统采用openEuler 22.03 LTS 1. 前期准备 因为机器内存只有16G,所有我采用3master 1node 1.1 修改主机配置(所有节…

扩散模型会成为深度学习的下一个前沿领域吗?

文章目录 一、说明二、 第 1 部分:了解扩散模型2.1 什么是扩散模型2.2 正向扩散2.3 反向扩散 三、他们的高成本四、扩散模型的用处五、为什么扩散模型如此出色六、第 2 部分:使用扩散模型生成6.1 用于自然语言处理和 LLM 的文本扩散6.2 音频视频生成6.3 …

下载安装Thonny并烧录MicroPython固件至ESP32

Thonny介绍 一、Thonny的基本特点 面向初学者:Thonny的设计初衷是为了帮助Python初学者更轻松、更快速地入门编程。它提供了直观易懂的用户界面和丰富的功能,降低了编程的门槛。轻量级:作为一款轻量级的IDE,Thonny不会占用过多的…

RDK X3(aarch64) 测试激光雷达思岚A1

0. 环境 - 亚博智能的ROSMASTER-X3 - RDK X3 1.0 0.1 资料 文档资料 https://www.slamtec.com/cn/Support#rplidar-a-series SDK https://github.com/slamtec/rplidar_sdk ROS https://github.com/slamtec/rplidar_ros https://github.com/Slamtec/sllidar_ros2 1. robostu…

1310. 子数组异或查询 异或 前缀和 python

有一个正整数数组 arr,现给你一个对应的查询数组 queries,其中 queries[i] [Li, Ri]。 对于每个查询 i,请你计算从 Li 到 Ri 的 XOR 值(即 arr[Li] xor arr[Li1] xor ... xor arr[Ri])作为本次查询的结果。 并返回一…

《精通ChatGPT:从入门到大师的Prompt指南》附录B:推荐阅读资源

作者:斯图尔特拉塞尔 (Stuart Russell) 和 彼得诺维格 (Peter Norvig) 简介:这本书被誉为人工智能领域的经典教材,内容涵盖了AI的基本原理、算法及其应用。无论是入门者还是专业研究者,都能从中获得启发。 2. 《深度学习》 作者…

【目标跟踪网络训练 Market-1501 数据集】DeepSort 训练自己的跟踪网络模型

前言 Deepsort之所以可以大量避免IDSwitch,是因为Deepsort算法中特征提取网络可以将目标检测框中的特征提取出来并保存,在目标被遮挡后又从新出现后,利用前后的特征对比可以将遮挡的后又出现的目标和遮挡之前的追踪的目标重新找到&#xff0…

企业网页制作

随着互联网的普及,企业网站已成为企业展示自己形象、吸引潜在客户、开拓新市场的重要方式。而企业网页制作则是构建企业网站的基础工作,它的质量和效率对于企业网站的成败至关重要。 首先,企业网页制作需要根据企业的特点和需求进行规划。在网…

前端 移动端 手机调试 (超简单,超有效 !)

背景:webpack工具构建下的vue项目 1. 找出电脑的ipv4地址 2. 替换 host 3. 手机连接电脑热点或者同一个wifi 。浏览器打开链接即可。

Spring运维之业务层测试数据回滚以及设置测试的随机用例

业务层测试数据回滚 我们之前在写dao层 测试的时候 如果执行到这边的代码 会在数据库 里面留下数据 运行一次留一次数据 开发有开发数据库,运行有运行数据库 我们先连数据库 在pom文件里引入mysql的驱动和mybatis-plus的依赖 在数据层写接口 用mybatis-plus进…

openh264 场景变化检测算法源码分析

文件位置 openh264/codec/processing/scenechangedetection/SceneChangeDetection.cppopenh264/codec/processing/scenechangedetection/SceneChangeDetection.h 代码流程 说明: 通过代码流程分析,当METHOD_SCENE_CHANGE_DETECTION_SCREEN场景类型为时…

Linux -- 了解 vim

目录 vim Linux 怎么编写代码? 了解 vim 的模式 什么是命令模式? 命令模式下 vim 的快捷键: 光标定位: 复制粘贴: 删除及撤销: 注释代码: 什么是底行模式? ​编辑 ​编辑…

Java:111-SpringMVC的底层原理(中篇)

这里续写上一章博客(110章博客): 现在我们来学习一下高级的技术,前面的mvc知识,我们基本可以在67章博客及其后面相关的博客可以学习到,现在开始学习精髓: Spring MVC 高级技术: …