当前位置: 首页 > news >正文

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💖点点关注,收藏不迷路💖

相关文章:

9.3 Go 接口的多态性

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…...

Java通过字符串字段匹配形成树形结构

Java通过字符串字段匹配形成树形结构 文章目录 Java通过字符串字段匹配形成树形结构数据表模拟数据解决办法:1、domian 类:2、Node层(形成树形关系):3、controller 层4、Util 工具类1、BeanCopierUtil4、Mapper5、Manager(用来组装树形结构)6、测试:有的时候我们形成树形不…...

数字孪生智慧水利:精准管理与智能决策的新时代

图扑数字孪生技术在智慧水利中的应用,通过虚拟模型与真实水利系统的无缝连接,实现对水资源和水利工程的全面监控和精细管理。实时数据采集与动态模拟提升了水利系统的预测和响应能力,从洪水预警到水质监测,数字孪生助力各项决策更…...

基于ChatGLM3的本地问答机器人部署流程

基于ChatGLM3的本地问答机器人部署流程 前言一、确定文件结构1.新建文件夹储存本地模型2.下载源码和模型 二、Anaconda环境搭建1.创建anaconda环境2.安装相关库3.设置本地模型路径4.启动 三、构建本地知识库1.下载并安装postgresql2.安装c库3.配置向量插件 四、线上运行五、 全…...

归并排序——逆序数对的统计

逆序数对的统计 题目描述 运行代码 #include <iostream> using namespace std; #define LL long long const int N 1e5 5; int a[N], tmp[N]; LL merge_sort(int q[], int l, int r) {if (l > r)return 0; int mid l r >> 1; LL res merge_sort(q, l,…...

基于截图和模拟点击的自动化压测工具开发(MFC)

1.背景 想对一个MFC程序做自动压测功能&#xff0c;根据判断程序界面某块区域是否达到预定状态&#xff0c;来自动执行鼠标点击或者键盘输入的操作&#xff0c;以解决测试人员需要重复手动压测问题。 1.涉及的技术 串口控制&#xff0c;基于MFC橡皮筋类(CRectTracker)做一个…...

力扣每日一题 6/10

881.救生艇[中等] 题目&#xff1a; 给定数组 people 。people[i]表示第 i 个人的体重 &#xff0c;船的数量不限&#xff0c;每艘船可以承载的最大重量为 limit。 每艘船最多可同时载两人&#xff0c;但条件是这些人的重量之和最多为 limit。 返回 承载所有人所需的最小船…...

[知识点] 内存顺序属性的用途和行为

C标准库中定义了以下几种内存顺序属性&#xff1a; std::memory_order_relaxedstd::memory_order_consumestd::memory_order_acquirestd::memory_order_releasestd::memory_order_acq_relstd::memory_order_seq_cst 1. std::memory_order_relaxed 定义&#xff1a;不提供同步…...

JAVA Mongodb 深入学习(二)索引的创建和优化

一、常用索引类型 1、单个索引 单个索引的创建 db.你的表名.createIndex({"你的字段名":1}) 单个索引的创建且是唯一索引 db.你的表名.createIndex({"你的字段名":1}),{ unique: true }) 2、复合索引 将多个过滤的字段&#xff0c;做成索引&#xff0c;…...

转让北京劳务分包地基基础施工资质条件和流程

地基基础资质转让流程是怎样的?对于企业来说&#xff0c;资质证书不仅是实力的证明&#xff0c;更是获得工程承包的前提。而在有了资质证书后&#xff0c;企业才可以安心的准备工程投标&#xff0c;进而在工程竣工后获得收益。而对于从事地基基础工程施工的企业&#xff0c;需…...

Python基础——字符串

一、Python的字符串简介 Python中的字符串是一种计算机程序中常用的数据类型【可将字符串看作是一个由字母、数字、符号组成的序列容器】&#xff0c;字符串可以用来表示文本数据。 通常使用一对英文的单引号&#xff08;&#xff09;或者双引号&#xff08;"&#xff09;…...

AP的数据库性能到底重要吗?

先说结论&#xff1a;没那么重要。甚至可能不重要。 我用我的经历和分析给大家说说。诸位看看如何。 不重要的观点是不是不能接受&#xff1f; 因为这些是站在我们角度觉得的。而实际上使用者&#xff08;业务或者用户&#xff09;&#xff0c;真的不太在乎我们所在乎的。 …...

Vue3【二】 VSCode需要安装的Vue语法插件

VSCode需要安装的 适配Vue3的插件 Vue-Official插件安装...

设置路径别名

一、描述 如果想要给路径设置为别名&#xff0c;就是常见的有些项目前面的引入文件通过开头的&#xff0c;也就是替换了一些固定的文件路径&#xff0c;怎么配置。 二、配置 import { defineConfig } from vite import react from vitejs/plugin-react import path from path…...

人事信息管理系统(Java+MySQL)

一、项目背景 在现代企业中&#xff0c;管理大量员工的工作信息、薪资、请假、离职等事务是一项非常繁琐和复杂的任务。传统的手工管理方式不仅效率低下&#xff0c;而且容易出错。为了提高人事管理的效率&#xff0c;减少人工操作带来的错误&#xff0c;企业迫切需要一个高效…...

Python 中生成器与普通函数的区别

在Python中&#xff0c;生成器和普通函数有一些区别。 生成器使用 yield 语句从函数中返回一个值&#xff0c;而不是使用 return 语句。当生成器函数被调用时&#xff0c;它会返回一个迭代器对象&#xff0c;而非立即执行函数体内的代码。 生成器函数可以通过多次调用 yield 语…...

最小栈、栈的弹出(C++)

1.最小栈 思路分析&#xff1a; 代码&#xff1a; class MinStack { public:MinStack() {}void push(int val) {st.push(val);//两种情况需要更新最小值//1.最小栈为空(就是存最小值的那个栈)//2.插入的值小于或等于最小栈的栈顶元素if(minstack.empty()||minstack.top()>…...

20240607每日通信--------VUE3前端引入scoket-io,后端引入Netty-SocketIO,我成功了,希望一起交流沟通

无语 前置&#xff1a; VUE3 前端集成scoket-io socket.io-client Sringboot 3.0JDK17集成Netty-SocketIO Netty-SocketIO 失败原因一&#xff1a; 前期决定要写demo时候&#xff0c;单独了解了&#xff0c;后端引入Netty-SocketIO注意事项&#xff0c;详见我先头写的博客 前…...

Tomcat源码解析(八):一个请求的执行流程(附Tomcat整体总结)

Tomcat源码系列文章 Tomcat源码解析(一)&#xff1a;Tomcat整体架构 Tomcat源码解析(二)&#xff1a;Bootstrap和Catalina Tomcat源码解析(三)&#xff1a;LifeCycle生命周期管理 Tomcat源码解析(四)&#xff1a;StandardServer和StandardService Tomcat源码解析(五)&…...

python使用gdb进行堆栈查看与调试

以ubuntu示例&#xff0c;先安装gdb与python-dbg&#xff0c;dbg按照python版本安装 apt install -y gdb python3.10-dbg 使用top查看python进程&#xff0c;使用gdb操作python进程 gdb python3 6618 加载环境 source /usr/share/gdb/auto-load/usr/bin/python3.10-gdb.py…...

java+uniapp集成unipush2实现消息推送

一、开通uniPush2.0 1.实名认证 登录DCloud开发者中心&#xff0c;通过实名认证 2.进入UniPush控制台 HBuilderX中打开项目的manifest.json文件 导航在“App模块配置” → 项的“Push(消息推送)” → “UniPush”下点击配置 或者申请开通。 3.配置应用信息 在UniPush开通界面…...

Python并发模型全景解析

Python并发模型全景解析:线程、协程、多进程与GIL深度实战 🐍 Python 的并发编程一直是个让人困惑的话题:GIL 是什么?什么时候用线程?什么时候用协程?什么时候用多进程?本文从底层原理到生产实战,彻底讲清楚 Python 的四种并发模型,附带性能对比测试和真实踩坑经验。…...

ncmdump工具完全攻略:解锁网易云音乐NCM格式转换的终极指南

ncmdump工具完全攻略&#xff1a;解锁网易云音乐NCM格式转换的终极指南 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM加密格式无法在其他播放器播放而烦恼吗&#xff1f;你是否经历过精心收藏的音乐只能…...

测水位·报雨情·预洪水:水文监测站

水文监测站采用先进平面阵列雷达微波探测技术&#xff0c;设备悬空架设、非接触式采集河道水体数据。通过高精度雷达天线持续发射微波信号&#xff0c;穿透空气介质触达水面后反射回波&#xff0c;系统精准测算信号传播时长与多普勒频移变化&#xff0c;结合设备自带角度校准功…...

暗黑破坏神2存档编辑器:3步掌握d2s-editor的终极修改指南

暗黑破坏神2存档编辑器&#xff1a;3步掌握d2s-editor的终极修改指南 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 还在为暗黑破坏神2中无尽刷装备而烦恼吗&#xff1f;想快速体验不同职业的build却不想花费数百小时&#xff…...

航模老鸟的‘省钱’秘籍:一块BB响如何守护你的多块锂电池(附设置误区避坑)

航模电池管理的低成本智慧&#xff1a;BB响的进阶使用策略 在航模和无人机领域&#xff0c;电池管理一直是玩家们关注的焦点。对于拥有多块电池的资深爱好者或小型工作室来说&#xff0c;如何在保证安全的前提下优化成本&#xff0c;是一个值得深入探讨的话题。传统做法是为每块…...

AI Token中转副业火爆!小白也能快速上手?3小时建站+真实盈利模式全解析!

很多观望的小白最纠结两个核心问题&#xff1a;普通人搭建一个Token中转站到底要多久&#xff1f;建好之后真的能赚钱吗&#xff0c;真实赚钱逻辑是什么&#xff1f; 今天不讲噱头、不吹月入几万&#xff0c;结合行业真实现状、新手实操经验&#xff0c;一次性讲透搭建耗时、成…...

科研人狂喜!AI生成的位图可以转矢量图了

今天给大家分享我最近挖到的宝藏科研工具&#xff1a;MedPeer「图片创作」——国内领先的垂直领域AI科研绘图工具&#xff0c;刚好解决我们科研人最头疼的几个痛点。尤其是它的人工绘图转换服务&#xff0c;简直是帮我解决了大麻烦&#xff0c;必须给大家捋捋明白。我们科研人绘…...

大模型长文档理解新拐点已至(2026年Claude专项能力解密):支持128K上下文+动态摘要锚点+引用溯源追踪

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;大模型长文档理解新拐点已至&#xff1a;Claude 2026能力演进全景图 随着长上下文窗口突破200万token、原生支持跨页语义锚定与结构化元数据感知&#xff0c;Claude 2026标志着大模型对长文档的理解正式…...

从零到一:Apache Log4j SocketServer反序列化漏洞(CVE-2019-17571)环境构建与深度复现

1. 漏洞背景与原理剖析 2019年曝光的CVE-2019-17571漏洞堪称Java生态中的"经典教材级"案例。这个存在于Log4j 1.2.x版本中的SocketServer反序列化漏洞&#xff0c;完美展示了安全领域最危险的攻击模式之一——通过日志组件实现远程代码执行。我当年第一次复现这个漏…...