【go从零单排】接口(interface)和多态(Polymorphism)
🌈Don’t worry , just coding!
内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。
📗概念
在Go语言中,interface 是一种重要的类型,用于定义一组方法的集合。
任何类型只要实现了这些方法,就可以被视为该接口的实现。
接口提供了一种灵活的方式来实现多态性,使得不同类型可以用同一方法进行操作。
💻代码
package mainimport ("fmt""math"
)// 用type和interface关键字定义了一个geometry接口,接口中包含了两个方法:area()和perim()
type geometry interface {area() float64perim() float64
}// 定义结构体rect,包含两个属性width, height float64类型
type rect struct {width, height float64
}
type circle struct {radius float64
}// 给结构体定义函数,rect和circle是不同的结构,实现不同的方法
func (r rect) area() float64 {return r.width * r.height
}
func (r rect) perim() float64 {return 2*r.width + 2*r.height
}func (c circle) area() float64 {return math.Pi * c.radius * c.radius
}
func (c circle) perim() float64 {return 2 * math.Pi * c.radius
}// measure()函数接受一个geometry接口类型的参数,并在函数内部调用该参数的area()和perim()方法,打印出对应的结果
func measure(g geometry) {fmt.Println(g)fmt.Println(g.area())fmt.Println(g.perim())
}func main() {r := rect{width: 3, height: 4}c := circle{radius: 5}measure(r)measure(c)
}
🔍理解
- 接口使用 type 关键字定义,后跟接口名称和方法签名
- 任何类型只要实现了接口中定义的所有方法,就自动实现了该接口,无需显式声明。
- interface是go中实现多态的方式:不同的数据结构实现相同的方法
💡 Tips小知识点
方法签名
在编程中,方法签名(Method Signature)是指方法的名称及其参数列表的组合。它用于唯一标识一个方法,并定义该方法的输入和输出。
方法签名通常包含:方法名称、参数列表(基本类型、结构体、interface接口)、返回值(可选)
Example:
func Add(a int, b int) int {return a + b
}
- 方法名称:Add
- 参数列表:a int, b int
- 返回值:int
方法签名的重要性:
- 唯一性:在同一个作用域内,方法的名称和参数列表的组合必须是唯一的。即使方法名称相同,但如果参数类型或数量不同,编译器也会将其视为不同的方法。
- 类型安全:方法签名帮助编译器检查方法调用时的参数类型是否匹配,确保类型安全。
- 多态性:在面向对象编程中,方法签名是实现多态性的基础。通过接口或基类定义方法签名,可以让不同的子类实现相同的方法,从而实现多态。
空接口
空接口(interface{})是没有任何方法的接口,表示任何类型的值。它可以用来处理不同类型的数据。
Example:
//空的方法interface{}
func PrintAnything(v interface{}) {fmt.Println(v)
}func main() {PrintAnything("Hello, World!")//stringPrintAnything(123)//intPrintAnything(true)//boolean
}
接口的嵌套
接口可以嵌套其他接口,从而形成更复杂的接口。
Example:
type Animal interface {Speak() string
}
//嵌套Animal接口,并新增一个Play方法
//意味着任何实现 Pet 接口的类型,必须同时实现 Animal 接口中的 Speak() 方法和 Pet 接口中的 Play() 方法。
type Pet interface {AnimalPlay() string
}type Dog struct{}
//dog 实现Speak()
func (d Dog) Speak() string {return "Woof!"
}
//dog 实现Play()
func (d Dog) Play() string {return "Fetch!"
}
💪无人扶我青云志,我自踏雪至山巅。
相关文章:

【go从零单排】接口(interface)和多态(Polymorphism)
🌈Don’t worry , just coding! 内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。 📗概念 在Go语言中,interface 是一种重要的类型,用于定义一组方法…...
SI5319C-C-GM,SiliconLabs芯科 SI5319C-C-GMR,时钟合成器/抖动清除器 封装 QFN-36 在售 20000PCS 23+
SI5319C-C-GM是SiliconLabs公司生产的时钟合成器和抖动清除器。它是一款高性能的时钟解决方案,可用于各种应用领域,包括通信、数据中心、消费电子等。 该器件采用了SiliconLabs独有的DSPLL技术,能够提供低抖动和高精度的时钟信号。它具有多个…...
使用批处理脚本批量删除Maven无效依赖
背景 在开发过程中,我们经常会遇到以下情况: 在pom.xml文件中错误地指定了依赖的名称。因为网络问题,某些依赖下载不完全。依赖版本号错误,导致下载的文件无法使用。 这些情况会导致Maven在本地仓库中留下一些无效的文件&#…...
腾讯cos对象存储,下行流量费贵,是否可以加入服务器减少费用,架构如何设计
腾讯云COS(Cloud Object Storage)对象存储服务提供了一种高效、安全、低成本的方式存储大量数据。然而,当涉及到外网下行流量时,确实会产生一定的费用,这可能会增加整体的成本。为了减少这些费用,可以通过以…...

【SAP】关于权限的继承
关于权限的父role和子role的权限继承,既可以 从子role主动去父role那里“取”。从父role“推”到子role 我自己之前一直用的是方法1,但由于子role很多,一个一个手工维护花了不少时间。 后来得知有方法2,特此测试。 我准备了父R…...
SpringBoot技术下的共享汽车运营平台
1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理共享汽车管理系统的相关信息成为必然。开发…...
SwiftUI开发教程系列 - 第7章:数据流和状态管理
SwiftUI 的核心优势之一在于其声明式的数据绑定和状态管理系统,使得在多视图间传递和更新数据变得更加直观和高效。在本章中,我们将讨论如何使用 ObservedObject、EnvironmentObject、StateObject 等属性包装器进行复杂的数据管理,确保应用的…...

Ubuntu系统安装NVIDIA驱动、CUDA、PyTorch等GPU深度学习环境
学习目标: 在Ubuntu系统上安装CUDA、PyTorch等GPU深度学习环境,主要目标是为深入研究深度学习和深度强化学习提供高效的计算支持。通过构建GPU环境,计划掌握深度学习的基本概念和算法应用,提高模型训练效率,特别是在复…...

电子学会2024年3月青少年软件编程(图形化)等级考试试卷(三级)真题,含答案解析
我们今天分享的资料是:电子学会2024年3月青少年软件编程(图形化)等级考试试卷(三级)真题,含答案解析 电子学会 2024 年 3 月青少年软件编程(图形化)等级三级考试的主要考点包括但不限于以下内容: 理解变量的概念:能够新建变量,知道如何在舞台区显示或隐藏变量,理解…...

初学者指南:用例图——开启您的软件工程之旅
目录 背景: 基本组成: 关联(Assciation): 包含(Include): 扩展(Extend): 泛化(Inheritance): 完整银行…...
二叉树遍历/算法数据结构
六、树 6.1遍历算法 6.1.1前中后序 在做递归时,最重要是三步骤 确定递归函数的返回值和参数 确定终止条件 确定单层递归的逻辑 伪代码 void travel(cur, vec) {if (cur null) {return ;}vec.push(cur->middle, vec); // 递归中节点vec.push(cur->left, …...
C#字符串的不可变性:内存管理与线程安全的优势分析
在C#编程中,字符串(String)被设计为不可变对象,这意味着一旦创建字符串对象后,其内容是不可更改的。这种设计通过在每次修改字符串时创建一个新实例,而不是直接更改原有字符串实例,来实现不可变…...
【杂记】之语法学习第四课手写函数与结构体
函数 如同我们数学中学的 f(x) ax b ,函数就是把一个东西丢进去,然后进行类似的操作变化,最终得到的可以是一个数,也可能什么都得不到而只是进行一项操作。 如sqrt() , max() 和 swap() 这样的其实都是函数&#x…...

细说STM32单片机USART中断收发RTC实时时间并改善其鲁棒性的另一种方法
目录 一、工程目的 1、目标 2、通讯协议及应对错误指令的处理目标 二、工程设置 三、程序改进 四、下载与调试 1、合规的指令 2、不以#开头,但以;结束,长度不限 3、以#开头,不以;结束,也不包含;,长…...

python使用turtle画图快速入门,轻松完成作业练习
turtle介绍 turtle是一个绘图库,可以通过编程进行绘图。其模拟了一个乌龟在屏幕上的运动过程。该库通常用于给青少年学习编程,当然,也可以使用其进行作图。 在一些学校中,可能在python学习的课程中,要求完成turtle绘…...

【C++】新手入门指南
> 🍃 本系列为初阶C的内容,如果感兴趣,欢迎订阅🚩 > 🎊个人主页:[小编的个人主页])小编的个人主页 > 🎀 🎉欢迎大家点赞👍收藏⭐文章 > ✌️ 🤞 …...

C++使用开源ConcurrentQueue库处理自定义业务数据类
ConcurrentQueue开源库介绍 ConcurrentQueue是一个高性能的、线程安全的并发队列库。它旨在提供高效、无锁的数据结构,适用于多线程环境中的数据交换。concurrentqueue 支持多个生产者和多个消费者,并且提供了多种配置选项来优化性能和内存使用。 Conc…...

在vue3的vite网络请求报错 [vite] http proxy error:
在开发的过程中 代理proxy报错: [vite] http proxy error: /ranking/hostRank?dateType1 Error: connect ETIMEDOUT 43.xxx.xxx.xxx:443 网络请求是http的: // vite.config.ts import { Agent } from node:http;server: {host: 0.0.0.0,port: port,open: true,https: false,…...
ElasticSearch 简单的查询。查询存在该字段的资源,更新,统计
1.查询存在该字段的数据 {"query": {"bool": {"must": [{"exists": { "field": "chainCode"}}],"must_not": {"exists": {"field": "isDelete"}}}} } 备注:…...
FOFA使用教程之从零到精通
FOFA使用教程之从零到精通 前言一、关于网络资产测绘的概念1、啥是网络空间资产测绘2、啥是互联网资产二、FOFA的简要介绍1、FOFA地址是啥?2、关于FOFA的简要介绍三、FOFA精讲1、运算符规则详解① 关于 = 号的使用说明② 关于 == 号的使用说明③ 关于 && 号的使用说明…...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...

tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...

nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...