【Golang】Go语言中如何面向对象?
✨✨ 欢迎大家来到景天科技苑✨✨
🎈🎈 养成好习惯,先赞后看哦~🎈🎈
🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,Golang开发,PyQt5和Tkinter桌面开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生K8S,linux,shell脚本等实操经验,网站搭建,数据库等分享。所属的专栏:Go语言开发零基础到高阶实战
景天的主页:景天科技苑
文章目录
- Go语言怎样实现面向对象
- 1. 面向对象的三大特性
- (1)封装
- (2)继承
- Go语言的继承:结构体的嵌套
- 匿名字段方式继承
- 聚合方式叫组合,不再是继承了
- (3)多态
- 2. 方法
- (1)Go语言中的方法
- (2)方法与函数对比总结
- (3)方法的重写
Go语言怎样实现面向对象
Go语言(Golang)虽然不是一个纯粹的面向对象编程语言,但它通过结构体(Struct)、接口(Interface)等机制,提供了面向对象的编程范式。
在实际的项目开发中,使用面向对象的理念可以显著提高代码的可维护性、可扩展性和可复用性。
1. 面向对象的三大特性
面向对象编程(OOP)的核心思想是将数据和操作数据的行为封装到对象中,通过对象之间的交互来完成程序的功能。OOP具有三大特性:封装、继承、多态。
(1)封装
封装是指将某事物的属性和行为包装到对象中,这个对象只对外公布需要公开的属性和行为,而这个公布也是可以有选择性的。在Go语言中,封装主要通过结构体实现。
(2)继承
生活中的继承:
兔子和羊属于食草动物类,狮子和豹属于食肉动物类。
食草动物和食肉动物又是属于动物类。
所以继承需要符合的关系是:is-a,父类更通用,子类更具体。
虽然食草动物和食肉动物都是属于动物,但是两者的属性和行为上有差别,所以子类会具有父类的一般特性也会具有自身的特性。
继承就是子类继承父类的特征和行为,使得子类具有父类的属性和方法,使得子类具有父类相同的行为。子类会具有父类的一般特性也会具有自身的特性。
java语言的继承,显示声明class User extends Person{
name
age
}
如此,当修改父类名称或者其中的方法,属性名称后,所有的子类的都得同步去改,比较麻烦
Go语言的继承:结构体的嵌套
Go语言中结构体嵌套,有两种方式
1、模拟继承 is - a
哪个结构体被继承(父类),就将哪个结构体当做一个字段写到 子类结构体里面
type A struct{field}type B struct{A // 匿名字段 B.Afield}// B继承A,B是可以直接访问A的属性的
2、聚合关系 has - a
type C struct{field}type D struct{c C //聚合关系,不使用匿名字段field}// D是无法直接访问C中的属性的,必须使用D.c.c_field
匿名字段方式继承
package mainimport "fmt"// Person 定义一个父类
type Person struct {name stringage int
}// Student 定义一个子类,Student拥有了父类所有的属性,还有自己的特性
type Student struct {Person // 父类以匿名字段形式作为子类的属性,实现了继承。school string
}func main() {// 1、 创建父类对象p1 := Person{name: "jingtian", age: 18}fmt.Println(p1)fmt.Println(p1.name, p1.age)// 2、创建子类s1 := Student{Person: Person{name: "小明", age: 3}, school: "景天科技苑"}fmt.Println(s1)fmt.Println(s1.Person.name, s1.Person.age, s1.school)// 3、创建子类var s2 Students2.Person.name = "张三"s2.Person.age = 3s2.school = "北大"fmt.Println(s2)// 概念:提升字段, 只有匿名字段才可以做到// Person 在Student中是一个匿名字段, Person中的属性 name age 就是提升字段// 所有的提升字段就可以直接使用了,不需要再通过匿名字段点来获取了var s3 Student//字段提升,可以直接用子类对象操作父类字段s3.name = "李四"s3.age = 4s3.school = "清华"fmt.Println(s3)fmt.Println(s3.name, s3.age)}
聚合方式叫组合,不再是继承了
package mainimport "fmt"//聚合继承type Human struct {name stringage int
}type Man struct {//聚合继承,不再以匿名字段形式将父类写在这,而是命名一个变量名Human Humanphone string
}func main() {//创建子类对象man := Man{Human: Human{"轩辕氏", 999},phone: "19899999999",}fmt.Println(man)//访问父类属性,聚合继承不能使用变量提升。提升字段, 只有匿名字段才可以做到//聚合方式继承,访问父类属性需要写全,对象.变量名.父类字段名fmt.Println(man.Human.name)}
继承就是子类继承父类的特征和行为,使得子类具有父类的属性和方法,使得子类具有父类相同的行为。子类会具有父类的一般特性也会具有自身的特性。
匿名字段 + 提升字段:Go语言中的匿名字段。
当继承多个父类具有相同属性字段的时候,就不能再使用字段提升了,因为此时就不能确定使用的是哪个父类的属性。
此时就要加上父类.属性名
(3)多态
多态需要结合接口实现,由于篇幅限制,下一章接着更新,敬请期待!
2. 方法
(1)Go语言中的方法
Go语言中同时拥有函数和方法。一定要和其他只有方法的语言区分开
类:结构体->属性、方法?
Go语言实现方法
方法:需要指定调用者,约定这个方法属于谁的. 对象.方法()
函数:不需要指定调用者,定义了函数就可以直接函数名()调用
方法:可以理解为函数多了一个调用者
方法定义, func 方法调用者 方法名(){} 方法的定义比函数多了个调用者
定义中,函数与方法就不一样,函数是 func 函数名(参数) 返回值 返回值类型 {}
1、方法可以重名,只需要调用者不同
2、如果调用者相同,则不能重名
package mainimport "fmt"// 方法:可以理解为函数多了一个调用者
// 方法可以重名,不同的对象,调用的结果是不一样的type Dog struct {name stringage int
}// 方法定义, func 方法调用者 方法名()
// 1、方法可以重名,只需要调用者不同
// 2、如果调用者相同,则不能重名
func (dog Dog) eat() {fmt.Println("Dog eating...")
}func (dog Dog) sleep() {fmt.Println("Dog sleep...")
}// 在Go语言中,fmt.Sprintf函数是一个非常实用的函数,它可以将一个字符串格式化为指定的格式。
// 它的用途非常广泛,可以用来构建复杂的字符串,包括打印日志、生成报错信息等。
// 带有参数和返回值的方法
func (dog Dog) xiaohua(food string) string {//返回值字符串格式化return fmt.Sprintf("%v吃进了%s, 吐出来骨头", dog.name, food)}type Cat struct {name stringage int
}func (cat Cat) eat() {fmt.Println("Cat eating...")
}
func (cat Cat) sleep() {fmt.Println("Cat sleep...")
}func main() {// 创建一个对象dog := Dog{name: "旺财",age: 2,}fmt.Println(dog)// 方法的调用,通过对应的结构体对象来调用dog.eat()//调用带有参数和返回值的方法back := dog.xiaohua("肉")fmt.Println(back)//不同对象调用同名方法cat := Cat{name: "喵喵", age: 1}cat.eat()//打印查看方法所属类型,类型跟函数一样都是func()fmt.Printf("方法所属类型: %T\n", cat.eat)
}
(2)方法与函数对比总结
方法:
- 某个类的行为功能,需要指定调用者
- 一段独立的代码功能,必须要使用调用者来调用
- 多个类的方法可以重名,单个类不行
- 方法是某个类的动作
函数:
-
一段独立的代码功能,可以直接调用
-
命名完全不能冲突
-
函数是一个特殊的类型
(3)方法的重写
需要和继承结合
子类可以重写父类的方法 override
子类还可以新增自己的方法
子类可以访问父类中的属性和方法
子类重写父类方法,方法名与父类方法相同,只是调用者改成了子类
package mainimport ("fmt"
)// 方法重写,建立在父类和子类结构上的type Animal struct {name stringage int
}// 父类方法
func (animal Animal) eat() {fmt.Println(animal.name, " 正在吃....")
}
func (animal Animal) sleep() {fmt.Println(animal.name, " 正在sleep....")
}//父类更通用,子类更具体// 子类type Dog2 struct {Animal
}// 子类自己的方法
func (dog Dog2) wang() {fmt.Println("wangwangwanwg~~~")
}type Cat2 struct {Animalcolor string // 子类可以定义自己的属性
}// 子类重写父类的方法 , 子类的方法名和父类同名,即可重写父类的方法
func (cat Cat2) eat() {fmt.Println(cat.name, " 正在吃cat....")
}func main() {// 定义一个子类,使用父类方法dog := Dog2{Animal{name: "旺财", age: 3}}dog.eat() // 调用父类的方法dog.wang() // 调用自己扩展的方法cat := Cat2{Animal{name: "煤球", age: 3}, "黑色"}cat.eat() // 如果重写了父类的方法就是调用子类自己的方法fmt.Println(cat.color) // 调用子类自己的属性// 子类可以操作父类的方法,父类可以操作子类的吗?不可以// 父类不能调用子类自己的扩展的方法a := Animal{name: "大黄", age: 3}//父类调用与子类同名方法,只能调用到父类自己的方法,不能调用子类扩展后的方法a.eat()a.sleep()}
Go语言面向对象详细教程,更高级的应用,持续更新中,感兴趣的朋友可以关注下,ღ( ´・ᴗ・` )比心
相关文章:

【Golang】Go语言中如何面向对象?
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...

E2VPT: An Effective and Efficient Approach for Visual Prompt Tuning
论文汇总 存在的问题 1.以前的提示微调方法那样只关注修改输入,而应该明确地研究在微调过程中改进自注意机制的潜力,并探索参数效率的极限。 2.探索参数效率的极值来减少可调参数的数量? 解决办法 提示嵌入进行transformer中 提示剪枝 Token-wise …...

影刀RPA实战:网页爬虫之天猫商品数据
1.实战目标 1.1 实战目标 在电商行业,我们经常爬取各个平台的商品数据,通过收集和分析这些商品数据,企业可以了解市场趋势、消费者偏好和竞争对手的动态,从而制定更有效的市场策略。爬取商品数据对于企业在市场竞争中把握先机、…...

微信小程序注册流程及APPID获取(完整版图文教程)
文章目录 前言1. 注册微信小程序账号1.1微信小程序注册1.2 点击注册按钮,进入小程序注册步骤。1.3 填写邮箱、密码、验证码1.4 用户信息登记1.5 微信扫码认证后,回到微信公众平台点击确认提交1.6 进小程序后台,完成注册 2.完善小程序账号信息…...

分享课程:VUE数据可视化教程
在当今这个数据驱动的世界中,数据可视化已经成为了一种至关重要的工具,它帮助我们理解复杂的数据集,发现模式、趋势和异常。数据可视化不仅仅是将数字转换成图表,它是一种将数据转化为洞察力的艺术。 1.什么是数据可视化…...

Flink的反压机制:底层原理、产生原因、排查思路与解决方案
反压(Backpressure)是流处理框架(如 Apache Flink)中非常重要的概念。反压的产生和有效处理,直接影响整个流处理作业的稳定性和性能。本文将从 Flink 的底层原理、反压产生的原因、如何排查反压问题,以及如…...

Unity DOTS系列之Aspect核心机制分析
最近DOTS发布了正式的版本, 我们来分享一下DOTS里面Aspect机制,方便大家上手学习掌握Unity DOTS开发。 Aspect 机制概述 当我们使用ECS开发的时候,编写某个功能可能需要某个entity的一些组件,如果我们一个个组件的查询出来,可能…...

webpack 的打包target讲解 node环境打包下的文件存储造成不易察觉的坑点
背景 electron 主渲进程的打包,以及 preload 的打包,还有注入脚本的打包,这些东西 webpack 本身是自带的,这里主要讲一下 target: node 模式 代码 https://gitee.com/sen2020/webpack-demo/tree/feature%2Fnode-code-package/ n…...

JVM面试问题集
什么是运行时数据区? 什么是JVM? 了解过字节码文件的组成吗? 说一下运行时数据区 哪些区域会出现内存溢出,会有什么现象? JM在JDK6-8之间在内存区域上有什么不同 类的生命周期 常见的类加载器 什么是双亲委派机制 说明各个类加载器之间的关系 解释双亲委派机制 …...

Go weak包前瞻:弱指针为内存管理带来新选择
在介绍Go 1.23引入的unique包的《Go unique包:突破字符串局限的通用值Interning技术实现》一文中,我们知道了unique包底层是基于internal/weak包实现的,internal/weak是一个弱指针功能的Go实现。所谓弱指针(Weak Pointer,也称为弱…...

ZStack AIOS平台智塔入选2024世界计算大会专题展优秀成果
9月24日至25日,由湖南省人民政府主办,湖南省工业和信息化厅、长沙市人民政府、中国电子信息产业发展研究院承办的2024世界计算大会在湖南长沙举办。云轴科技ZStack AIOS平台智塔凭借在智算领域的卓越表现,入选2024世界计算大会专题展优秀成果…...

总结 自行解决问题经验
一、总结在使用Linux时遇到的各种坑 yum 源要替换为国内源wget 需要用yum先行下载在make的时候需要预先安装各种库端口无法访问时要记得去防火墙开启端口访问权限安装完各种程序的时候记得创建环境变量或者软链接… 二、遇到故障如何正确高效的去解决 在使用yum下载wget的时…...

软件设计模式——工厂模式
软件设计模式——工厂模式 文章目录 软件设计模式——工厂模式一、设计模式的认知1.1 什么是软件设计模式:1.2 为什么要学习设计模式:1.3 设计模式的分类: 二、工厂模式2.1 工厂模式实例: 一、设计模式的认知 1.1 什么是软件设计…...

Apache Druid命令执行(CVE-2021-25646)
漏洞详情: Apache Druid 是用Java编写的面向列的开源分布式数据存储系统,旨在快速获取大量事件数据,并在数据之上提供低延迟查询。 Apache Druid含有能够执行嵌入在各种类型请求中由用户提供的JavaScript代码功能。此功能适用于高度信任环境…...

新的 MathWorks 硬件支持包支持从 MATLAB 和 Simulink 模型到高通 Hexagon 神经处理单元架构的自动化代码生成
MathWorks 今天宣布,推出针对 Qualcomm Hexagon™ 神经处理单元(NPU)的硬件支持包。该处理单元嵌入在 Snapdragon 系列处理器中。MathWorks 硬件支持包,则专门针对 Qualcomm Technologies 的 Hexagon NPU 架构进行优化,…...

gorm.io/sharding:改造,当查询条件中不包含分表键时,从自定义方法中获取对应的表进行查询
项目背景 这篇文章是一种特殊的情形——当查询条件中不包含分表键时,从自定义方法中获取对应的表进行查询。实际项目中并不建议这种用法。 当然,这里只是提供一种思路。这篇文章也是这个系列中的第三篇文章。前两篇文章《基于gorm.io/sharding分表中间…...

【CSS】变量的声明与使用
原生变量root 伪类 原生变量 CSS中我们可以统一设置变量方便页面维护。变量声明的时候,自定义样式变量名之前加上两根连词线 " – " 即可,使用 var() 来引用。声明的变量是有作用域的 ( 比如是在html中声明的变量,那么该变量在html…...

【数学分析笔记】第3章第4节闭区间上的连续函数(1)
3. 函数极限与连续函数 3.4 闭区间上的连续函数 3.4.1 有界性定理 【定理3.4.1】 f ( x ) f(x) f(x)在闭区间 [ a , b ] [a,b] [a,b]上连续,则 f ( x ) f(x) f(x)在闭区间 [ a , b ] [a,b] [a,b]上有界。 【证】用反证法,假设 f ( x ) f(x) f(x)在 [ …...

Mybatis中sql数组为空判断
一、Mybatis xml中的sql通过if语句判定是否为空 <if test"arrays ! null"> </if>上述示例只能判断arrays数组不为null,那如果是个空数组呢 二、Mybatis xml中的sql通过if语句判定数组非空数组 <if test"arrays ! null and arrays.l…...

12.第二阶段x86游戏实战2-CE找基地址
免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要…...

笔记整理—内核!启动!—linux应用编程、网络编程部分(3)文件共享与标准IO
文件共享是指同一个文件被多个独立的读写进行操作。同一个文件为同一个inode,同一个pathname也就是同一个静态文件。同时进行操作,打开一个文件未关闭又被另一个操作打开。文件共享的方式可以实现高效的大文件读写。 文件共享的三种方式:①同…...

plt常用函数介绍一
目录 前言plt.figure()plt.subplot()plt.subplots()plt.xticks()plt.xlim() 前言 Matplotlib是Python中的一个库,它是数字的-NumPy库的数学扩展。 Pyplot是Matplotlib模块的基于状态的接口。在Pyplot中可以使用各种图,例如线图,轮廓图&#…...

基于ExtendSim的 电子制造 仿真模型
说明: 此模型表示电路板制造设施。该过程有4个步骤: *焊料制备 *组件放置 *烤箱 *检查 详情: *烤箱的容量为10张卡,但如果烤箱循环开始时仅能处理5张卡,则最多只能处理5张。 *如果检查员发现问题,他们将修理…...

BGP 路由反射器
转载:BGP 路由反射器 / 实验介绍: / 原理概述 缺省情况下,路由器从它的一个 IBGP 对等体那里接收到的路由条目不会被该路由器再传递给其他IBGP对等体,这个原则称为BGP水平分割 原则,该原则的根本作用是防止 AS 内部的 BGP 路由…...

CSRF高级防御绕过
1)回顾low级别做过csrf页面的密码重置,重复之前的操作,我们发现级别调整中级之后,报错如下 2)检查源码 进入dvwa源码,查找到checktoken: 3)在dvwa-csrf页面上,抓包 http…...

MySQL安装文档-Windows
文章目录 MySQL安装1. 安装2. 配置 MySQL安装 1. 安装 1). 双击官方下来的安装包文件 2). 根据安装提示进行安装 安装MySQL的相关组件,这个过程可能需要耗时几分钟,耐心等待。 输入MySQL中root用户的密码,一定记得记住该密码 2. 配置 安装好MySQL之后…...

html TAB、table生成
1. 代码 <!DOCTYPE html> <head> <meta charset"UTF-8"> <title>Dynamic Tabs with Table Data</title> <style> /* 简单的样式 */ .tab-content { display: none; border: 10px solid #ccc; padding: 30px; mar…...

2024!再见前端!
各位朋友大家晚上好,夜深了,睡不着,想想还是写一篇文章和大家说再见吧! 自2014年入行前端以来,满打满算差不多整整十年了,这十年可以说是见证了中国整个互联网的起飞到全盛时期。这期间经历了电商、金融、…...

【源码+文档+调试讲解】人事管理系统设计与实现Python
摘 要 人事管理系统的目的是让使用者可以更方便的将人、设备和场景更立体的连接在一起。能让用户以更科幻的方式使用产品,体验高科技时代带给人们的方便,同时也能让用户体会到与以往常规产品不同的体验风格。 与安卓,iOS相比较起来ÿ…...

基于注意力机制的图表示学习:GRAPH-BERT模型
人工智能咨询培训老师叶梓 转载标明出处 图神经网络(GNNs)在处理图结构数据方面取得了显著的进展,但现有模型在深层结构中存在性能问题,如“悬挂动画问题”和“过平滑问题”。而且图数据内在的相互连接特性限制了大规模图输入的并…...