接口是 Go 语言实现 多态 的核心机制。本章将帮助你理解接口的设计哲学、动态行为,以及它如何让 Go 实现面向接口编程的能力。


一、什么是接口?

接口是一组方法签名的集合,任何类型只要实现了接口中声明的所有方法,就被视为实现了该接口不需要显式声明

接口定义示例:
type Speaker interface {Speak()
}

任何具有 Speak() 方法的类型,都会被认为实现了 Speaker 接口。


二、接口的使用

1. 定义接口与实现
type Animal interface {Speak()
}type Dog struct{}
func (d Dog) Speak() {fmt.Println("Woof!")
}type Cat struct{}
func (c Cat) Speak() {fmt.Println("Meow!")
}
2. 接口变量与多态调用
func MakeSound(a Animal) {a.Speak()
}func main() {var d Dogvar c CatMakeSound(d) // Woof!MakeSound(c) // Meow!
}

这就是多态:一个接口类型变量 a,可以代表多个实现了该接口的类型(如 Dog、Cat)。


三、接口值的底层机制(简要)

接口类型的变量底层由两部分组成:

  • • 动态类型:接口实际指向的具体类型
  • • 动态值:接口存储的具体值

这让接口可以灵活绑定不同实现,但仍保持统一调用接口方法的行为。


四、接口组合(interface embedding)

接口之间也可以组合:

type Reader interface {Read(p []byte) (n int, err error)
}type Writer interface {Write(p []byte) (n int, err error)
}type ReadWriter interface {ReaderWriter
}

任何类型只要实现了 Read() 和 Write() 方法,就实现了 ReadWriter 接口。


五、接口的动态行为与 nil 陷阱

var a Animal = nil
fmt.Println(a == nil) // truevar d *Dog = nil
a = d
fmt.Println(a == nil) // false!

原因:接口变量 a 本身不为 nil,它的动态类型是 *Dog,只是动态值为 nil。

解决:使用类型断言判断实际是否为 nil。


六、接口与工厂模式

接口是 Go 中实现解耦的核心工具,适合用于构建灵活的“工厂”类模式:

type Shape interface {Area() float64
}type Circle struct {Radius float64
}func (c Circle) Area() float64 {return 3.14 * c.Radius * c.Radius
}func NewShape(name string) Shape {switch name {case "circle":return Circle{Radius: 5}default:return nil}
}

七、小结

概念说明
接口方法集合的抽象,任何实现了接口方法的类型都符合接口
多态同一接口变量可绑定不同实现类型,统一调用方式
接口组合可通过嵌套组合多个接口
接口工厂模式常用于隐藏具体实现,返回接口类型以实现解耦
nil 陷阱接口变量底层包含“类型+值”,判断 nil 时需注意

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

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

相关文章

JSR 303(即 Bean Validation)是一个通过​​注解在 Java Bean 上定义和执行验证规则​​的规范

🛠️ 一、JSR 303是什么? JSR 303(Java Specification Requests 303)是Java EE 6的子规范,全称​​Bean Validation​​。它通过注解方式对JavaBean的属性值进行标准化校验,例如检查非空、长度、格式等规则…

【图像处理入门】3. 几何变换基础:从平移旋转到插值魔法

摘要 掌握图像的几何变换相当于学会「图像的空间魔法」。本文将带你理解平移/旋转/缩放的数学原理,掌握OpenCV中warpAffine和getAffineTransform的核心用法,对比最近邻、双线性等插值算法的优劣。通过图像翻转、镜像、透视变换实战,学会用变…

微信小程序学习目录

个人简介 👨‍💻‍个人主页: 魔术师 📖学习方向: 主攻前端方向,正逐渐往全栈发展 🚴个人状态: 研发工程师,现效力于政务服务网事业 🇨🇳人生格言&…

QT 5.15.2 程序中文乱码

1. 在.pro文件中添加: msvc { QMAKE_CXXFLAGS /source-charset:utf-8 /execution-charset:utf-8 }备注:.pro文件只有在选择 qmake 方式才会生成。 [Cmake 只会生成 CMakeLists.txt 文件] 2. 在文件首部增加以下程序行 #pragma execution_character_s…

Unity UI设计优化与模式原则

前言 在 Unity 中设计高效且可维护的 UI 系统时,需要结合性能优化和设计模式两大核心方向。以下是关键原则及实践方法: 对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀! 一、UI 性能…

CppCon 2014 学习: The Implementation of Value Types

“The Implementation of Value Types” 在C里,通常指的是如何设计和实现**值类型(value types)**的类,确保它们符合值语义(value semantics),也就是说: 对象的赋值和拷贝操作应该是…

每日算法刷题Day19 5.31:leetcode二分答案3道题,用时1h

6. 475.供暖器(中等,学习check函数双指针思想) 475. 供暖器 - 力扣(LeetCode) 思想 1.冬季已经来临。 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖。在加热器的加热半径范围内的每个房屋都可以获得供暖。现在,给出…

【计算机网络】第2章:应用层—应用层协议原理

目录 1. 网络应用的体系结构 2. 客户-服务器(C/S)体系结构 3. 对等体(P2P)体系结构 4. C/S 和 P2P 体系结构的混合体 Napster 即时通信 5. 进程通信 6. 分布式进程通信需要解决的问题 7. 问题1:对进程进行编址…

PHP+MySQL开发语言 在线下单订水送水小程序源码及搭建指南

随着互联网技术的不断发展,在线下单订水送水服务为人们所需要。分享一款 PHP 和 MySQL 搭建一个功能完善的在线订水送水小程序源码及搭建教程。这个系统将包含用户端和管理端两部分,用户可以在线下单、查询订单状态,管理员可以处理订单、管理…

vBulletin未认证API方法调用漏洞(CVE-2025-48827)

免责声明 本文档所述漏洞详情及复现方法仅限用于合法授权的安全研究和学术教育用途。任何个人或组织不得利用本文内容从事未经许可的渗透测试、网络攻击或其他违法行为。使用者应确保其行为符合相关法律法规,并取得目标系统的明确授权。 对于因不当使用本文信息而造成的任何直…

计算机模拟分子合成有哪些应用软件?

参阅:Top 创新大奖 以下是用于计算机模拟分子合成(包括逆合成设计、分子对接、分子动力学模拟及综合设计平台)的主流应用软件分类总结,结合其核心功能和应用场景进行整理: 🔬 一、逆合成设计与路线规划软件…

Excel 中的SUMIFS用法(基础版),重复项求和

1. 首先复制筛选条件所在的列,去除重复项目 数据 》重复项 》删除重复项 2. 输入函数公式 SUMIFS(C:C,A:A,E2) 3. 选中单元格,通过 ShiftF3 查看函数参数 第一个参数:求和区域,要累加的值所在的区域范围 第二个参数&#xff1a…

【xmb】内部文档148344597

基于小米CyberDog 2的自主导航与视觉感知系统设计报告 摘要: 本文针对2025年全国大学生计算机系统能力大赛智能系统创新设计赛(小米杯)初赛要求,设计并实现了基于小米仿生四足机器人CyberDog 2的平台系统方案。参赛作品利用Cyber…

从零开始理解机器学习:知识体系 + 核心术语详解

你可能听说过“机器学习”,觉得它很神秘,像是让电脑自己学会做事。其实,机器学习的本质很简单:通过数据来自动建立规则,从而完成预测或决策任务。 这篇文章将带你系统梳理机器学习的知识体系,并用贴近生活…

springboot集成websocket给前端推送消息

一般通常情况下,我们都是前端主动朝后端发送请求,那么有没有可能,后端主动给前端推送消息呢?这时候就可以借助websocket来实现。下面给出一个简单的实现样例。 首先创建一个websocketDemo工程,该工程的整体结构如下&a…

【清晰教程】查看和修改Git配置情况

目录 查看安装版本 查看特定配置 查看全局配置 查看本地仓库配置 设置或修改配置 查看安装版本 打开命令行工具,通过version命令检查Git版本号。 git --version 如果显示出 Git 的版本号,说明 Git 已经成功安装。 查看特定配置 如果想要查看特定…

【Github/Gitee Webhook触发自动部署-Jenkins】

Github/Gitee Webhook触发自动部署-Jenkins #mermaid-svg-hRyAcESlyk5R2rDn {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-hRyAcESlyk5R2rDn .error-icon{fill:#552222;}#mermaid-svg-hRyAcESlyk5R2rDn .error-tex…

C语言数据结构-链式栈

头文件&#xff1a;stack.h #ifndef __STACK_H__ #define __STACK_H__ #include <stdio.h> #include <stdlib.h> typedef int DataType; /* 链式栈节点类型 */ typedef struct staNode { DataType data; struct staNode *pNext; }StackNode; /* 链式栈…

M4Pro安装ELK(ElasticSearch+LogStash+Kibana)踩坑记录

ElasticSearch安装&#xff0c;启动端口9200&#xff1a; docker pull elasticsearch:8.13.0 新增配置文件elasticsearch.yml&#xff1a; cd /opt/homebrew/etc/ mkdir elasticsearch_config cd elasticsearch_config vi elasticsearch.yml cluster.name: "nfturbo…

uni-app学习笔记十六-vue3页面生命周期(三)

uni-app官方文档页面生命周期部分位于页面 | uni-app官网。 本篇再介绍2个生命周期 1.onUnload&#xff1a;用于监听页面卸载。 当页面被关闭时&#xff0c;即页面的缓存被清掉时触发加载onUnload函数。 例如:在demo6页面点击跳转到demo4&#xff0c;在demo4页面回退不了到d…