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

news2025/1/15 17:34:34

💓博主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 Teacher
	t1.Name = "neo_kou"
	t1.Age = 21
	t1.ID = 1001
	fmt.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 = 18
	t3.ID = 1006
	var t4 Teacher = Teacher{
		Name : "张三"
		Age : 40
		ID : 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 A
	tmp.Age = 18
	tmp.test()
}

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

方法和函数的区别:

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

4. GO中的封装与继承

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

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

type Person struct{
	Nation string
	Age int
	Weight int
}
type Chinese struct{
	Sex string
	hometown string
	Person//复用父类,加入匿名结构体
}
type American struct{
	enterprise string
	Person
}

func (p Person) ShowInfo(){
	fmt.Println(p.Age,p,Sex)
}
func main(){
	c := Chinese{}
	c.Age = 18
	c.Sex = "男"
	c.Person.ShowInfo()
}

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


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

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

type Person struct{
	Nation string
	Age int
	Weight int
}
type Chinese struct{
	Sex string
	hometown string
	Person//复用父类,加入匿名结构体
}
type American struct{
	enterprise string
	Person
}
上面在定义基本的结构体/
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.coloradmin.cn/o/1623304.html

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

相关文章

记内网http洪水攻击,导致网页无法访问一事

事由 最近两日,部分同事在访问税纪云平台时,登录跳转页面频繁转圈、要么就是出现无法连接的错误提示。 无法访问此页面 已重置连接。 请尝试: 检查连接 检查代理和防火墙 运行 Windows 网络诊断经过以下几方面的排查,无果。 后续通过检查…

【Node.js】02 —— Path模块全解析

🌟Node.js之Path模块探索🌈 📚引言 在Node.js的世界中,path模块就像一把万能钥匙🔑,它帮助我们理解和操作文件与目录的路径。无论你是初入Node.js殿堂的新手,还是久经沙场的老兵,理…

Docker容器概念介绍与基本管理

前言 在软件开发和部署环境中,使用 Docker 等容器技术可以帮助团队实现快速、一致、可靠的应用程序部署,提高开发效率和应用程序的可移植性。 目录 一、虚拟化产品介绍 1. 云服务模型 1.1 IaaS 1.2 PaaS 1.3 SaaS 1.4 DaaS 2. 产品介绍 2.1 虚…

【八股】Spring篇

why Spring? 1.使用它的IOC功能,在解耦上达到了配置级别。 2.使用它对数据库访问事务相关的封装。 3.各种其他组件与Spring的融合,在Spring中更加方便快捷的继承其他一些组件。 IoC和DI 👉IOC是Inversion of Control的缩写,“…

Nginx 四层和七层代理区别、配置

四层:通过报文中的目标地址和端口,加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器,使用tcp、udp协议。 七层:"内容交换",通过报文中真正有意义的应用层内容,加上负…

ETLCloud平台组件模版的使用技巧

ETL工具介绍 在ETLCloud平台中配备了各种不同的组件、模板、规则,用户可运用不同类型的组件来实现想要的业务流程。接下来直接进入平台组件模板的使用技巧说明吧。 使用技巧 1.组件复制 平时在使用的时候,如果遇到要用到一个组件,需要再来…

创建一个空的maven项目,整合SpringBoot和Redis

创建一个空的maven项目,整合SpringBoot和Redis 创建空的maven项目 在最新版的idea中创建maven项目的时候会让选择模板 如下图: 我们选择quickstart快速开始模板,quickstart快速开始模板创建的maven项目里面什么都不带,只有一个…

【机器学习】集成学习---投票法(Voting)

一、引言 集成学习(Ensemble Learning)是机器学习领域中的一种重要策略,它通过结合多个模型的预测结果来提高整体性能。在单个模型容易过拟合或欠拟合的情况下,集成学习能够通过综合多个模型的优点来减少这种风险,从而…

javaWeb项目-房屋房租租赁系统功能介绍

项目关键技术 开发工具:IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架:ssm、Springboot 前端:Vue、ElementUI 关键技术:springboot、SSM、vue、MYSQL、MAVEN 数据库工具:Navicat、SQLyog 1、JSP技术 JSP(Jav…

企业如何创建自己的维基百科词条?难吗?

维基百科词条创建与编辑概述 (Wikipedia)是全球网络上最大且最受大众欢迎的参考工具,其内容丰富、更新及时,被广泛应用于学术研究、商业决策和普通大众的查询需求。词条的创建与编辑对于很多人来说可能是一个挑战,但实…

echarts树图-实现拓扑图效果

使用echarts树图来实现拓扑图效果,其效果如下: 代码如下: const data {name: XXX公司,children: [{name: 网络主机,children: [{name: 普通路由器,children: [{name: 智能网关},{name: 192.168.1.0/24}]}]},{name: 企业路由器},{name: 三…

Linux 系统IO函数之lseek函数

lseek函数 要点&#xff1a; off_t lseek(int fd, off_t offset, int whence); seek 寻找 man 2 lseek标准C库的函数 #include <stdio.h> int fseek(FILE *stream, long offset, int whence);Linux系统函数 #include <sys/types.h> #include <unistd.h> off…

深度解析 Spring 源码:揭秘BeanFactory 之谜

文章目录 一、认识BeanFactory1.1 BeanFactory的概述1.2 BeanFactory与 ApplicationContext的区别 二、BeanFactory源码解读2.1 BeanFactory 接口2.1.1 getBean()2.1.2 containsBean()2.1.3 isSingleton() 2.2 DefaultListableBeanFactory 类2.2.1 registerBeanDefinition()2.2…

书生·浦语大模型实战营之Llama 3 高效部署实践(LMDeploy 版)

书生浦语大模型实战营之Llama 3 高效部署实践&#xff08;LMDeploy 版&#xff09; 环境&#xff0c;模型准备LMDeploy chatTurmind和Transformer的速度对比LMDeploy模型量化(lite)LMDeploy服务(serve) 环境&#xff0c;模型准备 InternStudio 可以直接使用 studio-conda -t …

mmcv bug记录

图像分类任务要用到mmcv框架&#xff0c;记录遇到的问题 1. Can‘t import build_from_cfg from mmcv. 解决命令&#xff1a;pip install openmim && mim install mmcv-full 2. python分布式训练 解决方案&#xff1a; 租用多张A40卡&#xff0c;执行下述命令&…

C# Solidworks二次开发:访问平面、曲面相关API详解

大家好&#xff0c;今天要介绍的是关于平面、曲面相关的API。 下面是相关的API: &#xff08;1&#xff09;第一个为ISurfacePlanarFeatureData&#xff0c;这个API的含义为允许访问平面表面特征&#xff0c;下面是官方的具体解释&#xff1a; 下面是官方使用的例子&#xff…

将非尾递归函数转换为循环或尾递归形式

1、问题背景 在 Python 中&#xff0c;非尾递归函数可能会导致递归深度限制问题。当递归深度超过限制时&#xff0c;程序将引发 RecursionError 异常。为了避免这个问题&#xff0c;我们可以将非尾递归函数转换为循环或尾递归形式。 2、解决方案 2.1 循环形式 我们可以使用…

Esko Ukkonen: On-line Construction of Suffix Trees

Esko Ukkonen: On-line Construction of Suffix Trees 文章目录 Esko Ukkonen: On-line Construction of Suffix Trees一、后缀树的概念及应用【详见刘方州同学报告】1.1 字典树 Trie1.2 后缀树 Suffix Tree2 后缀树的应用 二、朴素后缀树构造方法及问题三、线性时间内后缀树在…

C# GetMethod 方法应用实例

目录 关于 C# Type 类 GetMethod 方法应用 应用举例 类设计 类代码 小结 关于 C# Type 类 Type表示类型声明&#xff1a;类类型、接口类型、数组类型、值类型、枚举类型、类型参数、泛型类型定义&#xff0c;以及开放或封闭构造的泛型类型。调用 this.GetType() 方法得到…

GAN 生成对抗神经网络

GAN 文章目录 GANGAN的结构GAN的目标函数GAN的训练GAN的优势和不足优势不足 GAN的结构 GAN的设计灵感来源于博弈论中的零和博弈&#xff08;Zero-sum Game&#xff09;&#xff0c;在零和博弈中&#xff0c;参与双方的收益是完全相反的&#xff0c;一方的收益必然导致另一 方的…