【Go语言快速上手(四)】面向对象的三大特性引入

💓博主CSDN主页:杭电码农-NEO💓

⏩专栏分类:Go语言专栏⏪

🚚代码仓库:NEO的学习日记🚚

🌹关注我🫵带你学习更多Go语言知识
  🔝🔝


在这里插入图片描述

GO快速上手

  • 1. 前言
  • 2. 初识GO中的结构体
  • 3. 结构体的方法的引入
  • 4. GO中的封装与继承
  • 5. GO语言中的接口与多态
  • 6. 总结以及拓展

1. 前言

GO语言也支持面向对象编程,但是和传统的面向对象语言(如CPP)有明显的区别,GO并不是纯粹的面对对象编程语言.所以说GO是支持面向对象编程特性的,这样说比较合理

本章重点:

本篇文章会讲解GO中的结构体是如何定义并且使用的,并且会讲解结构体的方法与普通的函数有什么区别.再会讲解GO中的继承是如何实现的.最后会引入GO中接口的概念,并且由接口的用法衍生出GO的多态是如何实现的


2. 初识GO中的结构体

GO语言中没有class类,只有struct结构体,GO中的struct和其他语言中的class有着同等的地位.GO语言的面向对象非常简洁,没有复杂的重载,构造函数,以及析构函数,更没有什么隐藏的this指针.

语法使用:

type Teacher struct{Name string//姓名,string类型Age int//年龄,int类型ID int //学号,int类型
}
func main(){var t1 Teachert1.Name = "neo_kou"t1.Age = 21t1.ID = 1001fmt.Println(t1)
}

GO的结构体变量支持多种定义方式:

type Teacher struct{Name string//姓名,string类型Age int//年龄,int类型ID int //学号,int类型
}
func main(){var t2 Teacher = Teacher{"小明",25,1005)var t3 *Teacher = New(Teacher)t3.Name = "小红"t3.Age = 18t3.ID = 1006var t4 Teacher = Teacher{Name : "张三"Age : 40ID : 1007}fmt.Println(t2)fmt.Println(t3)
}

注意,GO语言中的结构体指针类型变量,在访问结构体中的成员变量时,可以直接使用点.不用使用箭头->.并且结构体是用户单独定义的类型,和其他类型进行转换时需要有完全相同的字段(名字,个数和类型).GO语言中的type相当于取别名,取的别名GO语言认为它是一种新的数据类型


3. 结构体的方法的引入

GO语言中的方法是作用在指定的数据类型上的.和指定的数据类型进行绑定,因此自定义类型都可以有方法(不仅仅是struct可以有),方法的声明和调用格式:

type A struct{Age int
}
func (a A) test(){fmt.Println(a.Age)
}
func main(){var tmp Atmp.Age = 18tmp.test()
}

上面的代码中,test就是结构体方法,第一个括号内容: (a A),证明这个方法绑定的是结构体A,只有结构体A变量才能访问这个方法,并且这个代码中的方法是结构体对象的值传递,所以方法内修改是不会影响外面的变量的.除此之外,如果一个类型实现了String()这个方法,那么fmt.Println默认会调用这个变量的String()进行输出

方法和函数的区别:

  1. 方法需要绑定指定的类型,而函数不需要
  2. 方法的调用为:变量.方法名(参数),而函数的调用是:函数名(参数)
  3. 对于函数来说,参数是什么类型就应该传入什么类型,但对方法来说,形参为值类型,也可以传递指针,形参为指针类型也可以传递值

4. GO中的封装与继承

这里就不多阐述封装和继承的概念了.GO语言中通过将结构体,以及结构体中的字段的首字母小写,这样一来其他包就不能使用(类似于private),然后在结构体所在的包提供一个大写的函数(set方法)用于操作结构体内的变量.再提供一个大写的Get方法,用于返回结构体中的数据

在这里插入图片描述
话不多说,直接举个例子:

type Person struct{Nation stringAge intWeight int
}
type Chinese struct{Sex stringhometown stringPerson//复用父类,加入匿名结构体
}
type American struct{enterprise stringPerson
}func (p Person) ShowInfo(){fmt.Println(p.Age,p,Sex)
}
func main(){c := Chinese{}c.Age = 18c.Sex = "男"c.Person.ShowInfo()
}

请注意,这里变量c是Chinese类型,它访问父类Person类中的变量或方法时,可以直接用.访问到,而不是使用c.Person.Age的方式,GO语言在这一块做了简化.并且不建议将父类和子类的变量重名. GO语言支持多继承,一个结构体嵌套多个匿名结构体
在这里插入图片描述


5. GO语言中的接口与多态

接口的存在是为了定义规则,规范或某种具体的功能,它需要使用interface关键字.话不多说,直接上demo代码

type Person struct{Nation stringAge intWeight int
}
type Chinese struct{Sex stringhometown stringPerson//复用父类,加入匿名结构体
}
type American struct{enterprise stringPerson
}
上面在定义基本的结构体/
type SayHello interface{//声明一个没有实现的方法sayHello()
}
//实现具体的方法
func (p Chinese) sayHello(){fmt.Println("你好")
}
//实现具体的方法
func (p American) sayHello(){fmt.Println("hi~")
}
func greet(s SayHello){s.sayHello()
}func main(){c := Chinese{}a := American{}greet(a)greet(c)
}

定义一个函数,专门用于和各国人打招呼的函数,接收具备sayHello接口的能力的变量

接口的注意事项:

  1. 接口中可以定义一组方法,但不需要实现,并且接口中不能包含任何变量
  2. 接口本身不能创建实例,但可以指向一个实现了该接口的自定义类型的变量
  3. 只要是自定义数据类型都可以实现接口,不仅仅是结构体变量
  4. 一个自定义类型可以实现多个接口
  5. 空接口没有如何方法,所以可以理解为所有类型都实现了空接口,也就是说可以将任意一个变量赋给空接口

走到这儿,细心的同学可能就发现了,接口SayHello中定义了函数sayHello,并且这个函数只能被Chinese或American对象调用,也就是说当我们在main函数中调用greet函数去执行sayHello函数时,若你是Chinese类型变量,那么就会打印"你好",如果是American类型变量就会打印"hi~".这上面的过程不就是多态吗?接口接收的是什么类型,那么就会调用什么类型的方法,这其实就是多态.GO语言中的多态其实就是用接口实现的!


6. 总结以及拓展

想当年我写C++的继承和多态时,至少写了4篇文章才把它讲清楚啊,GO语言的继承和多态就简单多了,没有那么多坑,也没有那么多花里胡哨的东西,真是简洁啊.还是内句话,本系统文章只将用法,保证你能看懂GO语言代码,并且能自己产出代码.然而原理以及实现细节我们都不谈


🔎 下期预告:文件操作和管道 🔍

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

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

相关文章

JAVA毕业设计136—基于Java+Springboot+Vue的房屋租赁管理系统(源代码+数据库)

毕设所有选题: https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootVue的房屋租赁管理系统(源代码数据库)136 一、系统介绍 本项目前后端分离,分为管理员、用户、工作人员、房东四种角色 1、用户/房东: …

【网络安全】网络安全协议和防火墙

目录 1、网络层的安全协议:IPsec 协议族 (1)IP 安全数据报格式 (2)互联网密钥交换 IKE (Internet Key Exchange) 协议 2、运输层的安全协议:TLS 协议 3、系统安全:防火墙与入侵检测 1、网络…

数据结构篇其二---单链表(C语言+超万字解析)

目录 前言: 一、顺序表的缺点和链表的引入。 二、链表概述 实现一个简单的链表 空链表的概念 三、链表的功能实现 链表的打印 链表节点的创建 链表的头插(自上而下看完分析,相信你会有所收获) 头插的前置分析 传值调用和…

OSPF的LSA与特殊区域

Area区域概念 *一个区域维护一张LSDB,路由器详细的链路信息只在这个区域内传播 不是每一台路由器都需要了解所有外部目的地的详细信息 *OSPF网络的层次化设计 通过区域ID标识 骨干( Backbone )区域,必须是area 0(骨干区域…

Dos慢速攻击

这里写自定义目录标题 Dos慢速攻击 Dos慢速攻击 测试结果为“Exit status: No open connections left",代表无此漏洞。 如果测试结束后connected数量较多,closed数量很少或0,说明之前建立的慢速攻击测试连接没有关闭&#…

书生·浦语 大模型(学习笔记-7)LMDeploy 量化部署 LLM-VLM 实践

目录 一、模型的部署 二、模型部署面临的问题 三、如何解决(两种方法) 四、LMDeploy相关知识 创建conda环境(漫长的等待) 五、使用LMDeploy与模型对话 六、设置最大KV Cache缓存大小 七、W4A16量化 八、客户端连接API服务器 一、模型的部署 二、…

NLP step by step -- 了解Transformer

Transformer模型 Transformer相关历史 首先我们先看一下有关Transformer模型的发展历史,下面的图是基于Transformer架构的一些关键模型节点: 图片来源于Hugging Face 图片来源于Hugging Face Transformer 架构 于 2017 年 6 月推出。原本研究的重点是…

Java面试八股之Java中为什么没有全局变量

Java中为什么没有全局变量 Java中没有传统意义上的全局变量,这是因为Java语言设计遵循面向对象的原则,强调封装性和模块化,以及避免全局状态带来的副作用。 封装性: 全局变量违反了面向对象编程中的封装原则,即隐藏对…

Spring Boot集成RabbitMQ快速入门Demo

1.什么是RabbitMQ? RabbitMQ是一款使用Erlang语言开发的,基于AMQP协议的消息中间件,作为一款优秀的消息系统,RabbitMQ有高并发、可扩展等优势,并适用于大型系统中各个模块之间的通信。 RabbitMQ的特点为: 持…

【白盒测试】单元测试的理论基础及用例设计技术(6种)详解

目录 🌞前言 🏞️1. 单元测试的理论基础 🌊1.1 单元测试是什么 🌊1.2 单元测试的好处 🌊1.3 单元测试的要求 🌊1.4 测试框架-Junit4的介绍 🌊1.5 单元测试为什么要mock 🏞️…

《前端面试题》- React - 如何区分函数组件和类组件

问题 如何区分函数组件和类组件? 答案 可以使用instanceof 或者Component.prototype.isReactComponent。 示例 函数组件 export default function FunctionComonent() {if(FunctionComonent.prototype.isReactComponent){console.log(FunctionComonent是类组件…

prompt提示词:AI英语词典优化版Pro,让AI教你学英语,通过AI实现一个网易有道英语词典

目录 一、前言二、效果对比三、优化《AI英语词典》提示词四、其他获奖作品链接 一、前言 不可思议!我的AI有道英语字典助手竟然与百度千帆AI应用创意挑战赛K12教育主题赛榜首作品差之毫厘 ,真的是高手都是惺惺相惜的,哈哈,自恋一…

docker 集群管理实战mesos+zookeeper+marathon(一)

一 实验环境 1.1 系统版本,本实验使用cnetos7.9版本镜像 1.2 准备5台虚拟机,其中3台master,两台slave,使用克隆的方式 1.3 使用远程连接工具登录 1.4 修改主机名 1.5 设置域名映射 每个虚拟机都配置一下,这里就演示一…

SN74LV1T125DBVR SN74LV1T125单电源单缓冲门,带三态输出CMOS逻辑电平转换器

SN74LV1T125DBVR 规格信息: 制造商:Texas Instruments 产品品种:转换 - 电压电平 RoHS:是 电源电压-最大:5.5 V 电源电压-最小:1.6 V 最小作业温度:- 40 C 最大作业温度: 125 C 安装风格:SMD/SMT 封装 / 箱体:SOT-23-5 封装:Cut Tape 封装:MouseReel 封装…

分类算法——ROC曲线与AUC指标(九)

知道TPR与FPR TPRTP/(TP FN) 所有真实类别为1的样本中,预测类别为1的比例 FPR FP/(FP TN) 所有真实类别为0的样本中,预测类别为1的比例 ROC曲线 ROC曲线的横轴就是FPRate,纵轴就是TPRate,当二者相等时,表示的意义…

使用API有效率地管理Dynadot域名,查询账户余额

关于Dynadot Dynadot是通过ICANN认证的域名注册商,自2002年成立以来,服务于全球108个国家和地区的客户,为数以万计的客户提供简洁,优惠,安全的域名注册以及管理服务。 Dynadot平台操作教程索引(包括域名邮…

无人机+遥控器:遥控数传链路二合一远距离传输遥控器技术详解

无人机遥控器是无人机飞行控制的重要组成部分,用于向无人机发送控制指令和接收无人机的状态信息。无人机遥控器通常具备多种功能,如开关机、起飞降落、飞行方向控制、摄像头控制等。 无人机遥控器大多数都具备以下基本特点: 无线传输&#x…

Qt | 窗口的显示及可见性|标题、透明度、启用/禁用|窗口标志、设置其他属性|获取窗口部件、设置父部件|鼠标光标

​显示事件:QEvent::show,处理函数为 showEvent(QShowEvent*) 隐藏事件:QEvent::hide,处理函数为 hideEvent(QHideEvent* ) 01 QWidget 类中与可见性有关的属性 visible:bool 访问函数: bool isVisible() const; virtual void setVisible(bool visible); 02 QWid…

3.搭建增长模型-数据洞察

用分享内容举例 分享一个内容出去,有很大概率会带来新的用户,会带来下载量 提升分享就是一个拉活用户数的方法 拆解【提升分享拉新\拉活用户数】: 【提升分享量】 【每次分享拉新\拉活用户数】 [谁在分享] 分享用户画像 分享高转化用户 …

【C 数据结构】图

文章目录 【 1. 基本原理 】1.1 无向图1.2 有向图1.3 基本知识 【 2. 图的存储结构 】2.1 完全图2.2 稀疏图和稠密图2.3 连通图2.3.1 (普通)连通图连通图 - 无向图非连通图 的 连通分量 2.3.2 强连通图强连通图 - 有向图非强连通有向图 的 强连通分量 2.3.3 生成树 - 连通图2.3…