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

news/2024/9/19 13:45:35/ 标签: golang, 开发语言, 后端

💓博主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.ppmy.cn/news/1435510.html

相关文章

Vue3后台管理系统推荐

目录 项目概述 🍟 项目展示 功能特点 🥗 结语 💨 项目概述 🍟 基于Vue 3框架与Element-Plus UI组件库技术精心构建的后端管理模板。该模板系统已成功实现一个基础的权限管理模块,宗旨在于为追求高效二次开发的开发…

这些慢性疾病会导致听力损失

慢性病与听损 慢性疾病所致的耳聋是指由于多种慢性疾病所导致的耳聋,其形成原因明确的患者,可以分为糖尿病性耳聋、维生素B缺乏性耳聋。 原因不明确者可称原因不明性感音神经性聋,其主要临床表现有听力发生障碍,并且一般多为双耳…

Sentinel 与 Hystrix:云原生时代的故障隔离与服务降级

在面对高流量和复杂的分布式系统时,保障服务的稳定性和可用性是至关重要的。故障隔离和服务降级是两种常用的技术手段,用来保护系统在面临故障或压力过大时仍能稳定运行。在这方面,Sentinel 和 Hystrix 是两个广泛使用的库,它们虽…

[Android][JAVA][kotlin] 获取各种语言的星期,月份,长月份,缩写月份

kotlin 写法 import java.text.DateFormatSymbolsprivate fun loadTime() {val calendarInstance Calendar.getInstance()val day calendarInstance.get(Calendar.DAY_OF_MONTH)val month calendarInstance.get(Calendar.MONTH)val weekday calendarInstance.get(Calendar…

Redis底层数据结构之IntSet

目录 一、概述二、IntSet结构三、自动升级 redis底层数据结构已完结👏👏👏: ☑️redis底层数据结构之SDS☑️redis底层数据结构之ziplist☑️redis底层数据结构之quicklist☑️redis底层数据结构之Dict☑️redis底层数据结构之Int…

Seatunnel-web build:prod 报错 jsx问题

问题1 JSX element implicitly has type any because no interface JSX.IntrinsicElements exists. 问题剖析 在使用typescript的时候,在vue或react、node中报以上错误,是JSX 元素隐式具有类型 "any",因为不存在全局类型 "J…

分布式架构搭建

搭建分布式架构涉及多个方面,包括系统设计、网络架构、数据存储、服务拆分、负载均衡、容错处理等。 基本步骤和考虑因素 1、需求分析 明确业务需求,包括系统的功能、性能、扩展性、安全性等要求。确定系统的用户规模、数据规模以及可能的增长趋势。 …

【网络安全】安全事件管理处置 — 应急响应简介

专栏文章索引:网络安全 有问题可私聊:QQ:3375119339 目录 学习目标 一、应急响应起源 二、应急响应基本概念 三、应急响应目标 四、应急响应流程 1.准备阶段 2.检测和分析阶段 2.1 检测分析阶段,强调持续 2.2 分析阶段 …

AIGC技术:发展现状与未来趋势

近年来,人工智能生成内容(AIGC)技术迅速发展,成为人工智能领域的一个热门话题。AIGC技术在多个领域取得了显著的进展,包括文本生成、图像生成、音频和视频生成等。这些技术的应用范围广泛,从媒体和娱乐&…

基于双向长短期神经网络的居民用电功率预测,基于gru神经网络的居民用电功率预测

目录 背影 摘要 LSTM的基本定义 LSTM实现的步骤 BILSTM神经网络 基于双向长短期神经网络的居民用电功率预测,基于gru神经网络的居民用电功率预测 完整代码:基于双向长短期神经网络的居民用电功率预测,基于gru神经网络的居民用电功率预测(代码完整,数据齐全)资源-CSDN文库…

go垃圾回收机制

Go 语言的垃圾回收(Garbage Collection, GC)机制是其内存管理的核心部分,它负责自动检测并回收不再使用的内存。Go 的垃圾回收机制可以分为以下几个主要类别: 1. 标记(Mark) 根节点:垃圾回收从…

OpenHarmony语言基础类库【@ohos.taskpool(启动任务池)】

任务池(taskpool)作用是为应用程序提供一个多线程的运行环境,降低整体资源的消耗、提高系统的整体性能,且您无需关心线程实例的生命周期。您可以使用任务池API创建后台任务(Task),并对所创建的任…

leetcode刷题笔记——使用双指针处理链表问题

面试的时候经常碰见诸如获取倒数第k个元素,获取中间位置的元素,判断链表是否存在环,判断环的长度等和长度与位置有关的问题。这些问题都可以通过灵活运用双指针来解决 如果存在环,如何判断环的长度呢?方法是&#xff…

java的单元测试和反射

单元测试 就是针对最小的功能单元,编写测试代码对其进行正确性测试 Junit单元测试框架: 可以用来对方法进行测试 有点: 可以灵活的编写测试代码,可以针对某个方法进行测试,也支持一键完成对全部方法的自动发测试&a…

不碎片化学习,尽量用整块的时间系统化学习

从高中毕业之后,我们好像就很难再继续那种系统化的学习,甚至失去了自我知识构建的能力。然而,真正的理解和掌握知识需要深入和连贯,这正是系统化学习的优势所在。 系统化学习的重要性 全面理解:系统化学习能够帮助我…

部署轻量级Gitea替代GitLab进行版本控制(一)

Gitea 是一款使用 Golang 编写的可自运营的代码管理工具。 Gitea Official Website gitea: Gitea的首要目标是创建一个极易安装,运行非常快速,安装和使用体验良好的自建 Git 服务。我们采用Go作为后端语言,这使我们只要生成一个可执行程序即…

SQLAlchemy的使用

SQLAlchemy中filter函数的使用 https://blog.csdn.net/m0_67093160/article/details/133318889 创建临时字段 select id , CONCAT(‘内容’) AS fullname from example_table; Pandas数据类型转换_pandas转换数据类型 https://blog.csdn.net/qq_41404557/article/details/125…

设计前后端系统以处理长时间运行的计算任务并提供缓存支持

后端设计 1. 任务队列 创建一个任务队列来存储提交的计算任务。 Component public class TaskQueue {private final Queue<CalculationTask> queue new LinkedList<>();public synchronized void addTask(CalculationTask task) {queue.add(task);}public sync…

【数据结构】树和森林(树和森林的存储结构、树森林二叉树的转换、树和森林的遍历

5.树和森林 5.1 树的存储结构 树的逻辑结构 树是n个结点的有限集合。n0时称为空树。 在任意一棵非空树中应满足&#xff1a; 1&#xff09;有且只有一个特定的根结点&#xff1b; 2&#xff09;当n>1&#xff0c;其余结点可分为m个互不相交的有限集合&#xff0c;每个集合本…

【CSS】CSS实现元素逐渐消失(实现元素透明逐渐消失/模糊)

mask-image: linear-gradient(to bottom, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 1) 10%);mask-image 属性用于定义一个遮罩&#xff0c;它可以隐藏元素的一部分或全部内容。在这个示例中&#xff0c;我们使用 mask-image 属性来定义一个线性渐变的遮罩&#xff0c;使得列表项的内…