Go语言之接口与多态 -《Go语言实战指南》 - 指南

news/2025/10/7 15:32:48/文章来源:https://www.cnblogs.com/lxjshuju/p/19128545

接口是 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 Dog    var c Cat     MakeSound(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 {    Reader    Writer}

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


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

var a Animal = nilfmt.Println(a == nil) // true var d *Dog = nila = dfmt.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.mzph.cn/news/930554.shtml

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

相关文章

厦门网站建设费用嘉祥县建设局网站

阿里云服务器配置怎么选择?CPU内存、公网带宽和系统盘怎么选择?个人开发者或中小企业选择轻量应用服务器、ECS经济型e实例,企业用户选择ECS通用算力型u1云服务器、ECS计算型c7、通用型g7云服务器,阿里云服务器网aliyunfuwuqi.com整…

加强网站建设的请示英文建站平台

本专栏内容为:八大排序汇总 通过本专栏的深入学习,你可以了解并掌握八大排序以及相关的排序算法。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:八大排序汇总 🚚代码仓库:小小unicorn的代码仓库…

网站开发 调试天津建设工程信息网怎么登录

转自:http://www.blogjava.net/lukangping/archive/2010/08/01/327693.html 记得在当时学习uml总是不好分清聚合与组合的关系,找工作时特地复习了这块的内容,结果正巧被面试官问道,这两天又在搞这块的内容,对聚合与组合…

网站备案网站前置审批网站建设中的安全问题

文章目录 前言1. 安装数据库2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射2.3 测试随机公网地址远程连接 3. 配置固定TCP端口地址3.1 保留一个固定的公网TCP端口地址3.2 配置固定公网TCP端口地址3.3 测试固定地址公网远程访问 前言 MongoDB是一个基于分布式文件存储的数…

Success of Europa

The Success of Europa dues to her geographic diversity and its close to the largest land, Asia so it can "pirate".and its a \(\Delta\) just like India, not the ☽ like Arabs or J.The major ci…

2025多校冲刺CSP模拟赛4 总结

比赛:2025多校冲刺CSP模拟赛4 日期:\(25.10.07\),场地:\(\text{accoder}\),排名:\(42/114\) 估分:\(100+100+28+25=253\) 终分:\(100 + 100+28+29 =257\) 应该得分:\(100+100+28+71=299\) 失分 \(T_4\) 纯暴力…

多路归并、败者树、置换-选择排序、最佳归并树

目录一、多路归并二、败者树三、置换-选择排序四、最佳归并树一、多路归并 1. 基本概念 多路归并是外部排序第二阶段的核心操作。它将多个已经排序好的序列(称为“归并段”或“顺串”)合并成一个更大的有序序列。这里…

实用指南:shiro、struts2、weblogic特征流量分析

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

网站建设估价门户网站建设相关需求

目录 1.Web页面检查器 2.客户端-代理抓包 3.自动化测试工具 3.1接口自动化测试 3.2webUI自动化测试 3.3客户端UI自动化测试 4.手机模拟器测试工具 5.阿里云测试工具 1.Web页面检查器 F12查看html页面,查看页面大小和加载时间 2.客户端-代理抓包 Charles&a…

看vue文档记录(未整理)

简介 | Vue.js.vue文件又称单文件组件,里面包含基础三件套 为什么两个导入一个用花括号一个不用<div id="app"></div> <script type="module"> import { createApp } from vu…

Spring5笔记

Spring 常用依赖org.springframework spring-webmvc 5.2.0.RELEASE-- 注解 1.@Resource(常用)自动装配,通过类型,名字可通过加name属性精细 寻找 2.@Autowired自动装配,通过名字,类型,如果不能自动装配则需要@Qua…

50天50个前端项目 - HTML/CSS和JavaScript实战合集

这是一个包含50个前端实战项目的完整合集,涵盖动画效果、交互组件、实用工具等多种类型。每个项目都使用纯HTML、CSS和JavaScript实现,适合前端开发者学习和参考。50天50个前端项目 - HTML/CSS和JavaScript实战合集 …

广东省住房城乡建设厅网站商城小程序价格

当我做了一个实体类&#xff0c;字段为del_flag的逻辑删除字段&#xff0c;要通过这个字段控制数据库中的数据逻辑删除。 重写mapper中的deleteById&#xff0c; 先按id查出数据&#xff0c;在更新此数据中的del_flag字段为1&#xff0c;调用update方法更新数据。 这种方式我…

【笔记】用命令手动下载并安装 tokenizers 库.whl文件(Python 3.12+) - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

【办公类-48-04】202506每月电子屏台账汇总成docx-5(问卷星下载5月范围内容,自动获取excel文件名,并转移处理) - 实践

【办公类-48-04】202506每月电子屏台账汇总成docx-5(问卷星下载5月范围内容,自动获取excel文件名,并转移处理) - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !impor…

党徽

☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭☭ ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ░░░░░░░…

网站开发的概要设计模板抖音服务商平台

文章目录二、安装步骤1. 创建数据库2. 修改配置文件3. 调整数据库驱动4. 修改配置中心二、 启动和验证2.1. 启动nacos2.2. 启动TC Server2.3. 启动第二个节点2.4. 验证高可用二、安装步骤 1. 创建数据库 创建名称为ry_seata的数据库,并初始化ry_seata_20210128.sql脚本 2.…

ZKEACMS:基于ASP.Net Core开发的开源免费内容管理系统

前言 哈喽,大家好!我是码农刚子,大家应该都已和床分手,去上班了吧。国庆假期在家没事,试用了一下ZKEACMS,一个可视化拖拽的内容管理系统,今天给大家介绍一下。 简介 ZKEACMS也叫纸壳CMS,是由纸壳软件自主研发的…

文件系统的层次结构

![image-20251007145304913](/Users/tusier/Library/Application Support/typora-user-images/image-20251007145304913.png)1.用户需要通过操作系统提供的结构发出上述请求--用户接口 2.由于用户提供的是文件存放路径…