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

初识Go语言18-面向对象【面向对象的概念、构造函数、继承与重写 泛型】

文章目录

  • 面向对象
    • 面向对象的概念
    • 构造函数
    • 继承与重写
    • 泛型


面向对象

面向对象的概念

  洗衣服过程剖析:

  1. 给洗衣机里加脏衣服和洗衣粉。
  2. 启动洗衣机。
  3. 洗衣机自动注水,然后滚动。
  4. 脏衣服从黑颜色变成白颜色。
  5. 洗衣机自动停止。

  用面向过程的思想实现代码。

//准备洗衣服
//输入参数:
//powder 洗衣机里放多少洗衣粉
//closes 洗衣机里放多少衣服
//clean 衣服是否是干净的
//返回值:
//洗衣机是否开启
//准备洗多少衣服
func prepare(powder int, closes int, clean bool) (bool, int) {if powder <= 0 || closes <= 0 || clean == true {return false, 0}return true, closes
}//开始洗衣服
//输入参数:
//washer_state 洗衣机是否开启
//closes 准备洗多少衣服
//返回值:
//衣服是否是干净的
//洗了多少衣服
//洗衣机是否开启
func wash(washer_state bool, closes int) (bool, int, bool) {if washer_state == false {return false, 0, false} else {fmt.Println("注水")fmt.Println("滚动")fmt.Println("关机")return true, closes, false}
}//检查最终状态
//输入参数:
//clean 衣服是否是干净的
//closes 洗了多少衣服
//washer_state 洗衣机是否开启
func check(clean bool, closes int, washer_state bool) {if clean && closes > 0 {fmt.Printf("洗干净了%d件衣服\n", closes)if washer_state {fmt.Println("你忘关洗衣机了")}} else {fmt.Println("洗衣失败")}
}//整个洗衣服的过程
func WashProcedure(powder, closes int) {washer_state := falseclean := falsewasher_state, closes = prepare(powder, closes, clean)clean, closes, washer_state = wash(washer_state, closes)check(clean, closes, washer_state)
}

  面向过程编程整个过程分为若干步,每一步对应一个函数,函数之间要传递大量的参数。
  面向对象编程把大量参数封装到一个结构体里面,给结构体赋予方法,方法里面去修改结构体的成员变量。go语言面向对象的好处:打包参数,继承,面向接口编程。

//洗衣机
type Washer struct {State  boolPowder int
}//衣服
type Closes struct {Clean bool
}func (washer *Washer) prepare(closes []*Closes) error {if washer.State == true || washer.Powder <= 0 || len(closes) <= 0 {return errors.New("请确保在关机的状态下加入适量衣物和洗衣粉")}return nil
}func (washer *Washer) wash(closes []*Closes) error {if err := washer.prepare(closes); err != nil {return err}fmt.Println("开机")washer.State = true//检查是否有脏衣服clean := truefor _, ele := range closes {if ele.Clean == false {clean = falsebreak}}if clean {washer.State = falsereturn errors.New("所有衣服都是干净的,不需要洗")}//开始洗衣服fmt.Println("注水")fmt.Println("滚动")fmt.Println("关机")washer.State = falsefor _, ele := range closes {ele.Clean = true}return nil
}func (washer *Washer) check(err error, closes []*Closes) {if err != nil {fmt.Printf("洗衣失败:%v\n", err)} else {fmt.Printf("洗干净了%d件衣服\n", len(closes))if washer.State == true {fmt.Println("你忘关洗衣机了")}}
}

构造函数

  定义User结构体。

type User struct {Name string //""表示未知Age int //-1表示未知Sex byte //1男,2女,3未知
}
  • u := User{}构造一个空的User,各字段都取相应数据类型的默认值。
  • up := new(User)构造一个空的User,并返回其指针。

  自定义构造函数

func NewDefaultUser() *User {return &User{Name: "",Age: -1,Sex: 3,}
}
func NewUser(name string, age int, sex byte) *User {return &User{Name: name,Age: age,Sex: sex,}
}

  单例模式,确保在并发的情况下,整个进程里只会创建struct的一个实例。

var (sUser *UseruOnce sync.Once
)
func GetUserInstance() *User {uOnce.Do(func() { //确保即使在并发的情况下,下面的3行代码在整个go进程里只会被执行一次if sUser == nil {sUser = NewDefaultUser()}})return sUser
}//调用GetUserInstance()得到的是同一个User实例
su1 := GetUserInstance()
su2 := GetUserInstance()
//修改su1会影响su2

继承与重写

  通过嵌入匿名结构体,变相实现“继承”的功能,因为访问匿名成员时可以跳过成员名直接访问它的内部成员。

type Plane struct {color string
}
type Bird struct {Plane 
}
bird := Bird {}
bird.Plane.color
bird.color

重写

func (plane Plane) fly() int {return 500
}//重写父类(Plane)的fly方法
func (bird Bird) fly() int {return bird.Plane.fly()+100 //调用父类的方法
}

  正规来讲,Go语言并不支持继承,它只是支持组合。

type Plane struct {}
type Car struct{}
//Bird组合了Plane和Car的功能
type Bird struct {Plane Car
}

泛型

  在有泛型之前,同样的功能需要为不同的参数类型单独实现一个函数。

func add4int(a, b int) int {return a + b
}
func add4float32(a, b float32) float32 {return a + b
}
func add4string(a, b string) string {return a + b
}

使用泛型

type Addable interface{
type int, int8, int16, int32, int64,uint, uint8, uint16, uint32, uint64, uintptr,float32, float64, complex64, complex128,string
}
func add[T Addable](a,b T)T{return a+b
}

  在go1.17中泛型默认没有开启,如果想用需要加-gcflags=-G=3,或者设置环境变量export GOFLAGS=“-gcflags=-G=3”。泛型正式版将在go 1.18中发布,但是Go语言之父Rob Pike建议不在Go 1.18的标准库中使用泛型。

相关文章:

初识Go语言18-面向对象【面向对象的概念、构造函数、继承与重写 泛型】

文章目录 面向对象面向对象的概念构造函数继承与重写泛型 面向对象 面向对象的概念 洗衣服过程剖析&#xff1a; 给洗衣机里加脏衣服和洗衣粉。启动洗衣机。洗衣机自动注水&#xff0c;然后滚动。脏衣服从黑颜色变成白颜色。洗衣机自动停止。 用面向过程的思想实现代码。 //…...

4.微服务项目实战---Sentinel--服务容错

4.1 高并发带来的问题 在微服务架构中&#xff0c;我们将业务拆分成一个个的服务&#xff0c;服务与服务之间可以相互调用&#xff0c;但是由于网络 原因或者自身的原因&#xff0c;服务并不能保证服务的 100% 可用&#xff0c;如果单个服务出现问题&#xff0c;调用这个服务…...

Postgres SELECT INSERT 流程 ?

SELECT 当执行SELECT查询时&#xff0c;PostgreSQL数据库会按照以下流程进行处理&#xff1a; 首先&#xff0c;查询语句会被发送到服务器。 服务器会接收查询请求&#xff0c;并根据查询条件从表中读取数据。 数据库会将数据存储在磁盘上的数据文件中&#xff0c;然后将其读…...

OpenAI推企业版ChatGPT,英伟达造AI安全卫士

GPT现在已经进入了淘金时代。虽然全球涌现出成千上万的大模型或ChatGPT变种&#xff0c;但一直能挣钱的人往往是卖铲子的人。 这不&#xff0c;围绕暴风眼中的大模型&#xff0c;已经有不少企业&#xff0c;开始研究起了大模型的“铲子”产品&#xff0c;而且开源和付费两不误…...

【原创】运维的终点是开发~chatGPT告诉你真相

文章目录 软件技术岗位鄙视链&#xff0c;你在哪层呢&#xff1f;让chatGPT告诉你运维工作好&#xff0c;还是开发工作好问它几个问题来自你的消息: 一个三年开发成长的案例和薪资来自ChatAI的消息:来自你的消息: 一个三年运维成长的案例和薪资来自ChatAI的消息:来自你的消息: …...

SSH 服务器、NFS 服务器、TFTP 服务器详解及测试

文章目录 前言一、SSH 服务器1、SSH 能做什么&#xff1f;2、安装 SSH 服务器3、测试 SSH 服务4、用 SecureCRT 测试 二、NFS 服务器1、NFS 能做什么&#xff1f;2、安装 NFS 软件包3、添加 NFS 共享目录4、启动 NFS 服务5、测试 NFS 服务器 三、TFTP 服务器1、TFTP 能做什么&a…...

1.3 HBase 基本架构

架构角色&#xff1a; 1&#xff09;Master 实现类为 HMaster&#xff0c;负责监控集群中所有的 RegionServer 实例。主要作用如下&#xff1a; &#xff08;1&#xff09;管理元数据表格 hbase:meta&#xff0c;接收用户对表格创建修改删除的命令并执行 &#xff08;2&#x…...

微机作业题

答案做的&#xff0c;正确性不保证。 1. 微型计算机的性能主要取决&#xff08; A &#xff09;的性能。 A. CPU B. 显示器 C. 硬盘 D. U盘 2. 计算机的工作过程&#xff0c;本质是&#xff08; A &#xff09;的过程。 A. 进行科学计算 …...

非极大值抑制详细原理(NMS含代码及详细注释)

作者主页&#xff1a;爱笑的男孩。的博客_CSDN博客-深度学习,YOLO,活动领域博主爱笑的男孩。擅长深度学习,YOLO,活动,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typecollect 个…...

女朋友说总是记不住Git命令,怎么办?安排!

如果你也和我女朋友一样总是忘记Git命令&#xff0c;觉得记忆Git命令是很枯燥和麻烦的事情。我写了一个包含了40 条常用Git命令的清单。你一定要收藏起来&#xff0c;当你忘记Git命令的时候&#xff0c;就可以打开来查看啦&#xff01;&#xff01;&#xff01; 1.初始化本地仓…...

【ChatGLM】本地版ChatGPT ?6G显存即可轻松使用 !ChatGLM-6B 清华开源模型本地部署教程

目录 感谢B站秋葉aaaki大佬 前言 部署资源 部署流程 实机演示 ChatGML微调&#xff08;人格炼成&#xff09;&#xff08;个人感觉蛮有趣的地方&#xff09; 分享有趣の微调人格 实机演示&#xff08;潘金莲人格&#xff09; 感谢B站秋葉aaaki大佬 秋葉aaaki的个人空间…...

【MySQL】练习六 关系数据理论及数据库设计

文章目录 主要内容练习题一、选择题二、填空题三、判断题四、简答题主要内容 一个不好的关系模式可能存在的问题;函数依赖及三种函数依赖的定义:完全、部分、传递范式及1NF/2NF/3NF/BCNF的判定模式分解数据库设计的基本步骤概念设计(E-R图)逻辑模型(E-R图转换为逻辑模型的…...

UG NX二次开发(C++)-建模-修改NXObject或者Feature的颜色(一)

文章目录 1、前言2、在UG NX中修改Feature的颜色操作3、采用NXOpen(C)实现3.1 创建修改特征的方法3.2 调用ModifyFeatureColor方法3.3 测试结果 1、前言 在UG NX中&#xff0c;改变NXObject和Feature的操作是不相同的&#xff0c;所以其二次开发的代码也不一样&#xff0c;我们…...

全球天气weather.com的icon汇总表 天气现象代码枚举

全球天气weather.com的icon汇总表 天气现象代码枚举 Icon代码天气情况(列举常见情况,不包含全部)3大暴雨、大暴雨伴有风4大雷雨、强雷雨、雷雨、雷雨伴有风5雨或雪、雨伴有阵雪6雨夹冰粒、雨夹冰粒伴有风7雨夹雪、小雨夹雪、雪伴有冰粒和风、小雨夹雪伴有风、雪伴有冰粒8冻毛雨…...

【Python】【进阶篇】16、settings.py配置文件详解

目录 settings.py配置文件详解1. settings.py文件介绍1) BASE_DIR2) SECRET_KEY3) DEBUG4) ALLOWED_HOSTS5) INSTALLED_APPS6) MIDDLEWARE7) ROOT_URLCONF8) TEMPLATES9) WSGI_APPLICATION10) DATABASES11) AUTH_PASSWORD_VALIDATORS12) LANGUAGE_CODE和TIME_ZONE13) USE_118N和…...

【华为机试】HJ1 字符串最后一个单词的长度

【华为机试】 HJ1 字符串最后一个单词的长度 描述 计算字符串最后一个单词的长度&#xff0c;单词以空格隔开&#xff0c;字符串长度小于5000。&#xff08;注&#xff1a;字符串末尾不以空格为结尾&#xff09; 输入描述&#xff1a; 输入一行&#xff0c;代表要计算的字符串…...

Spring DI简介及依赖注入方式和依赖注入类型

目录 一、什么是依赖注入 二、依赖注入方式 1. Setter注入 2. 构造方法注入 3. 自动注入 三、依赖注入类型 1. 注入bean类型 2. 注入基本数据类型 3. 注入List集合 4. 注入Set集合 5. 注入Map集合 6. 注入Properties对象 往期专栏&文章相关导读 1. Maven系…...

ES6栈方法和队列方法

在 JavaScript 这门语言中&#xff0c;栈和队列是非常重要的数据结构&#xff0c;它们可以帮助我们更好地组织和管理数据。我们可以使用 ES6 标准中新增的方法来实现栈和队列的操作。这篇文章将介绍 ES6 中数组的栈方法和队列方法。 栈(Stack) 栈是一种后进先出&#xff08;L…...

EventBus(事件总线)的使用和源码的简单解析

Google Guava EventBus(事件总线)的使用和源码的简单解析 什么是EventBus&#xff1f; 事件总线&#xff08;EventBus&#xff09;是一种广泛用于软件架构中的设计模式&#xff0c;用于实现解耦和松散耦合的通信机制。它可以帮助组织和管理应用程序中不同组件之间的通信&…...

《汇编语言》- 读书笔记 - 第2章-寄存器

《汇编语言》- 读书笔记 - 第2章-寄存器 2.0 8086CPU 寄存器段地址:偏移地址 2.1 通用寄存器2.2 字在寄存器中的存储2.3 几条汇编指令表2.1汇编指令举例表2.2 程序段中指令的执行情况之一问题 2.1表2.3 程序段中指令的执行情况之二问题 2.2 检测点 2.12.4 物理地址2.5 16位结构…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...