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

一文玩转Go语言中的面向对象编程~

温故而知新:什么是面向对象

面向对象(Object-Oriented)是一种计算机编程的方法和思想,它将程序中的数据(对象)和操作(方法)组织成一个个相互关联和交互的对象。对象是现实世界中的事物或概念在计算机程序中的抽象表示。

面向对象编程的核心思想是将问题分解为一组相互作用的对象,每个对象都具有自己的状态(属性或数据)和行为(方法或操作),并通过对象之间的消息传递来进行协作和交互。

图片

总结一句,面向对象就是将一些具有相同特性的事物,通过类的形式进行统一封装。封装的类中的属性和方法,就是事物间具有相同的特征和行为。例如,人有身高、体重等特征,跑步的行为。身高和体重对应类中的属性,跑步对应类中的方法。

面向对象的优势

面向对象有几大特点,封装、继承和多态,针对这些特点,可以总结出如下的几个优势:

1、模块化和可重用性:面向对象编程允许将代码组织成独立的对象或类,每个对象都具有特定的功能和行为。这种模块化的方式使代码更易于理解、维护和重用,可以提高开发效率。

2、封装和信息隐藏:面向对象编程通过封装将数据和相关方法封装在对象内部,隐藏了对象的实现细节,只暴露必要的接口。这样可以防止外部代码直接访问和修改对象的内部状态,提高代码的安全性和可靠性。

3、继承和代码复用:继承是面向对象编程的一个重要概念,它允许通过从现有类派生出新类来扩展和重用代码。子类可以继承父类的属性和方法,并可以添加、修改或覆盖这些属性和方法,从而实现代码的复用和扩展。

4、多态和灵活性:多态是面向对象编程的另一个重要概念,它允许同一种行为有不同的表现形式。通过多态,可以根据对象的实际类型来调用相应的方法,这样可以增加代码的灵活性和可扩展性。

5、更易于理解和维护:面向对象编程提供了一种自然的思维方式,能够更好地模拟和表示现实世界的概念和关系。这样使得代码更易于理解、调试和维护,减少了代码的复杂性和耦合性。

总的来说,面向对象编程语言提供了一套丰富的概念和技术,在代码结构、复用性、可维护性和灵活性等方面具有明显的优势,使得软件开发更加高效和可靠。

Go中的面向对象

相信从你刚开始学习Go时,以及使用Go参与项目,都知道Go中没有面向对象这样的概念。但在实际的项目开发中,为了提高代码的可维护性、可扩展性和可复用性等特点,你不得不使用面向对象的设计理念来编码。

图片

那该怎么实现呢,答案就是使用Go中结构体来实现。

需要注意的是,本文不会单独去讲结构体的语法内容。重点是总结结构体与面向对象的区别。

什么是结构体

在Go语言中,结构体(Struct)是一种自定义数据类型,用于组织和存储一组相关字段的集合。它类似于其他编程语言中的类或对象,是一种将数据和相关方法组合在一起的容器。

1、结构体的字段就类似于面向对象中的属性。

2、结构体的方法就类似于面向对象中的方法。

要定义一个结构体非常的简单,其语法格式如下:

type 结构体名称 struct {字段名 字段属性
}func (接受者) 方法名称([方法参数]) [方法返回值] {}

下面我们就来实际定义一个结构体。

package mainimport "fmt"type Animal struct {name   stringage    stringheight float64weight float64
}func (u Animal) run() {fmt.Println(u.name, "跑步的速度很快")
}func main() {animal1 := &Animal{name: "鸵鸟",}animal1.run()// output:鸵鸟 跑步的速度很快
}

1、定义一个名为Animal的结构体,就相当于面向对象中的类。

2、定义name、age等字段,就相当于面向对象中的属性。

3、定义run()方法,就相当于面向对象中的方法。记住:方法一定是要有一个接收者的,这里的接收者为结构体Animal,其实就是将这个方法归属到结构体Animal。就好比在类中定义一个方法,这个方法就是属于这个类。

4、使用&Animal{},就相当于面向对象的实例化类的过程。

5、使用animal1.run(),就相当于实例化了一个对象,通过对象去调用方法。

是不是发现使用struct,实现面向对象是非常简单。

对象继承

在具有面向对象的开发语言中,使用对象继承,都是使用关键字extend关键字来实现。在Go中,可以使用结构体嵌套的方式来实现继承关系。

package mainimport "fmt"type Animal struct {name   stringage    stringheight float64weight float64
}type Dog struct {Animalcolor string
}func (u Animal) run() {fmt.Println(u.name, "跑步的速度很快")
}func (d Dog) sleep() {fmt.Println(d.name, "晚上很少睡觉")
}func main() {dog := &Dog{Animal{name: "小狗"},}dog.sleep()dog.run()
}

1、上述定义了一个Animal的结构体,作为父类结构体。同时定义了一个run()方法,当做父类的方法,定义了4个字段当做父类的属性。

2、接着定义了一个Dog结构体,嵌入了一个Animal的结构体,此时两个结构体就实现了一个继承的关系。

3、Dog结构体自身也定义了一个sleep()的方法。这时,Dog结构体具备父类结构体的所有方法和属性,同时也有自己的属性和方法。

需要注意的是,结构体的嵌套,可以是外部包,也可以是本包。方法的接收者必须是本包的结构体,不能是外部包。

此致,结构体实现对象的特性,就总结的差不多了。记住Go中的机构体不仅能实现面向对象的特性,同时还具有其他更强大的功能。这里简单的举例。

type user struct {name string `json:"name"`
}

上面的写法,相信大家在很多的第三方包,以及项目开发中都能遇到。通过定义一个tag,可以将元数据通过tag的定义方式,暴露给外部。

小 结

在Go语言中,struct是一种用户自定义的数据类型,用于组织和存储不同字段类型的数据。它类似于其他编程语言中的结构体,但在Go中,struct不具备面向对象编程中类的所有特性。以下是struct与面向对象的主要区别:

1、继承:Go语言中的struct不支持继承,无法通过一个struct来继承另一个struct的成员和方法。而面向对象编程中,类之间可以通过继承来共享和扩展功能。

2、封装:在面向对象编程中,类的成员和方法可以进行封装,通过访问修饰符来控制其可见性。而在Go中,struct的成员默认是公开的,可以被外部访问,无法像类一样进行严格封装。

3、多态:面向对象编程支持多态性,一个对象可以根据不同的上下文表现出不同的行为。而Go语言中的struct不直接支持多态,但可以通过接口来实现类似的效果。

总的来说,虽然Go语言的struct不同于传统的面向对象编程语言中的类,但通过结合使用接口、嵌入等语言特性,我们仍然可以在Go中实现类似面向对象的设计和编程范式。

相关文章:

一文玩转Go语言中的面向对象编程~

温故而知新:什么是面向对象 面向对象(Object-Oriented)是一种计算机编程的方法和思想,它将程序中的数据(对象)和操作(方法)组织成一个个相互关联和交互的对象。对象是现实世界中的事…...

kylin集群反向代理(健康检查)

前面一篇文章提到了使用nginx来对kylin集群进行反向代理, kylin集群使用nginx反向代理-CSDN博客文章浏览阅读349次,点赞8次,收藏9次。由于是同一个集群的,元数据没有变化,所以,直接将原本的kylin使用scp的…...

【docker】centos7安装harbor

目录 零、前提一、下载离线包二、安装三、访问四、开机自启 零、前提 1.前提是已经安装了docker和docker-compose 一、下载离线包 1. csdn资源:harbor-offline-installer-v2.10.0.tgz 2. 百度云盘(提取码:ap3t):harbo…...

2024 年 1 月安全更新修补了 58 个漏洞(Android )

谷歌发布了针对 Android 平台 58 个漏洞的补丁,并修复了 Pixel 设备中的 3 个安全漏洞,拉开了 2024 年的序幕。 Android 2024 年 1 月更新的第一部分以 2024 年 1 月 1 日安全补丁级别发布在设备上,解决了框架和系统组件中的 10 个安全漏洞&…...

数据库系统概念 第七版 中文答案 第3章 SQL介绍

3.1 将以下查询使用SQL语言编写,使用大学数据库模式。 (我们建议您实际在数据库上运行这些查询,使用我们在书籍网站db-book.com上提供的示例数据。有关设置数据库和加载示例数据的说明,请参阅上述网站。) a. 查找计算机…...

什么是数通技术?以太网交换机在数通技术中的精要

什么是数通技术? 数通技术是指数字通信技术,它涵盖了数字信号处理、数据传输、网络通信等领域。通信工程师在数通技术中负责设计、建设和维护数字通信系统,以实现可靠、高效的信息传输。这涉及到数字信号的编解码、调制解调、数据压缩、网络…...

php 的数学常用函数

目录 1.常用列表 2.代码示例 1.常用列表 函数名描述输入输出abs()求绝对值数字绝对值数字ceil()进一法取整浮点数进一取整floor()舍去法求整浮点数直接舍去小数部分fmod()浮点数取余 两个浮点 数,x>y 浮点余数 pow()返回数的n次方基础数n次方乘方值round()浮点数四舍五入…...

Netty-Netty组件了解

EventLoop 和 EventLoopGroup 回想一下我们在 NIO 中是如何处理我们关心的事件的?在一个 while 循环中 select 出事 件,然后依次处理每种事件。我们可以把它称为事件循环,这就是 EventLoop 。 interface io.netty.channel. EventLoo…...

银行的压力测试如何进行?

为什么要进行压力风险测试? 压力风险测试的最终目的是测试银行在极度恶劣的市场环境中是否有足够的资本维持运转。 题主链接中的一级资本充足率(Tier 1 capital ratio) 亦即衡量标准,这个数字越大,表明银行资本约充裕,可以在停止…...

QtService、托盘程序使用

1、QtService 使用QtService实现Qt后台服务程序 用QT创建一个Windows Service以及踩到的若干坑 2、托盘程序 Qt之程序最小化托盘显示及操作 Qt系统托盘程序的实现...

使用Linux防火墙管理HTTP流量

在Linux系统中,防火墙是用于控制网络流量的重要工具。通过防火墙,你可以根据需要限制、过滤或允许特定的网络流量,从而提高系统的安全性。在处理HTTP流量时,防火墙可以帮助你实施访问控制、流量监控和其他安全策略。 iptables i…...

图鸟引入多套字体图标的方式教程

https://www.yuque.com/tuniao/qunyou/tgfvpg ①上传icon,生成iconfont.css 将css文件放这里 app.vue全局引入 适当改造iconfont.css的写法,方便调用...

在openEuler环境下快速编译GreatSQL RPM包

在上一篇中,已经介绍了在CentOS环境下编译GreatSQL RPM包的过程,本文再介绍如何在openEuler环境下编译GreatSQL RPM包。 运行环境是docker中的openEuler 22.03 x86_64: $ docker -v Docker version 20.10.10, build b485636$ docker run -itd…...

C语言基础语法跟练 day3

31、不使用累计乘法的基础上&#xff0c;通过移位运算&#xff08;<<&#xff09;实现2的n次方的计算。 #include <stdio.h> int main() {int i 0;scanf("%d",&i);printf("%d",1<<i);return 0; } 32、问题&#xff1a;一年约有 3.…...

【控制篇 / 策略】(7.4) ❀ 01. IP地理位置数据库和地理地址对象 ❀ FortiGate 防火墙

【简介】在很多使用环境下&#xff0c;我们需要对指定国家的IP地址进行允许或禁止访问操作&#xff0c;例如只允许访问国内IP。以前只能手动添加IP地址对象到地址组&#xff0c;繁杂且效率低下&#xff0c;Fortinet提供了基于地理位置的IP库&#xff0c;就可以解决这个问题。 I…...

NX二次开发点通过云配准获取相同体

先找到体的参考方向&#xff08;这个参考方向对于相同体重合之后是相同的&#xff09;&#xff0c;这个时候我们的思路是三个不共线的点确定一个坐标系&#xff0c;然后和绝对方向求转换矩阵。然后获取体的所有边的几何中心&#xff0c;把这些点通过转换矩阵转换之后存起来&…...

5.4 Android BCC环境搭建(eadb版 下)

四,BCC使用示例 这里以tcplife为例,来显示TCP会话的生命周期和吞吐量统计。 4.1 进入/bcc/tools目录 root@localhost:/bcc# cd tools/ root@localhost:/bcc/tools# ls CMakeLists.txt javacalls.sh rubystat_example.txt argdist.py javacalls_e…...

【AI视野·今日Robot 机器人论文速览 第七十四期】Wed, 10 Jan 2024

AI视野今日CS.Robotics 机器人学论文速览 Wed, 10 Jan 2024 Totally 17 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers Hold em and Fold em: Towards Human-scale, Feedback-Controlled Soft Origami Robots Authors Immanuel Ampomah Mensah, Je…...

服务端性能测试——性能测试工具JMeter-L1

第一遍没学懂&#xff0c;后续文章会更新~ 目录&#xff1a; 1.JMeter介绍与安装Meter简介JMeter安装2.JMeter的运行JMeter运行、界面功能简介3.使用代理服务器录制请求录制压测脚本&#xff08;一&#xff09;Web端脚本录制方法4.测试计划5.线程组6.控制器7.JMeter采样器/取…...

C# OpenCvSharp DNN FreeYOLO 目标检测

目录 效果 模型信息 项目 代码 下载 C# OpenCvSharp DNN FreeYOLO 目标检测 效果 模型信息 Inputs ------------------------- name&#xff1a;input tensor&#xff1a;Float[1, 3, 192, 320] --------------------------------------------------------------- Outp…...

U盘启动安装win11遇到缺少计算机所需的介质驱动程序问题

一、使用U盘制作启动盘遇到问题 下载了windows原版镜像&#xff0c;验证了md5&#xff0c;确保文件没有损坏。使用ultroiso制作u盘启动盘&#xff0c;开始安装后出现下图的报错&#xff1a; 在网上搜索解决方案&#xff0c;主要有以下几种&#xff1a; 安装的时候&#xff0c…...

正则表达式、文件访问(Python实现)

一、主要目的&#xff1a; 1.了解正则表达式的基本概念和处理过程。 2.掌握使用正则表达式模块 Re 进行字符串处理的方法。 3.了解文件的基本概念和类型。 4.掌握在 Python 中访问文本文件的方法和步骤。 5.熟悉在 Python 中访问二进制文件的方法和步骤。 二、主要内容和结…...

ES高级查询

ES中提供了一种强大的检索数据方式&#xff0c;这种检索方式称为Query DSL&#xff0c;这种方式的丰富查询语法让ES检索变得更强大&#xff0c;更简洁。 1.常见查询 1.1查询所有[match_all] match_all关键字&#xff1a;返回索引中的全部文档。 GET /products/_search { &…...

RT-Thread入门笔记6-空闲线程及两个常用的钩子函数

空闲线程 空闲线程是一个比较特殊的系统线程&#xff0c;它具备最低的优先级。当系统中无其他就绪线程可运行时&#xff0c;调度器将调度到空闲线程。 空闲线程还负责一些系统资源回收以及将一些处于关闭态的线程从线程调度列表中移除的动作 空闲线程在形式上是一个无线循环结…...

网络正常运行时间监控工具

正常运行时间是衡量系统可靠性的指标&#xff0c;表示为机器工作和可用时间的百分比。当提到 IT 网络时&#xff0c;正常运行时间是衡量网络设备、网站和其他服务的可用性的指标。网络正常运行时间通常以百分位数来衡量&#xff0c;例如“五个 9”&#xff0c;这意味着系统在 9…...

DEJA_VU3D - Cesium功能集 之 112-获取圆节点(1)

前言 编写这个专栏主要目的是对工作之中基于Cesium实现过的功能进行整合,有自己琢磨实现的,也有参考其他大神后整理实现的,初步算了算现在有差不多实现小140个左右的功能,后续也会不断的追加,所以暂时打算一周2-3更的样子来更新本专栏(每篇博文都会奉上完整demo的源代码…...

Matlab 建文件夹保存本次仿真图表数据和参数

文章目录 前言代码 前言 有时候跑的仿真参数非常多&#xff0c;保存结果的时候需要把仿真参数和数据一起保存&#xff0c;为方便起见&#xff0c;查了一下怎么建文件夹自动保存本次仿真图表数据和参数&#xff0c;再也不用担心忘记结果是什么参数跑出来的了~ 代码 % 定义变量…...

@JsonFormat与@DateTimeFormat

JsonFormat注解很好的解决了后端传给前端的格式&#xff0c;我们通过使用 JsonFormat可以很好的解决&#xff1a;后台到前台时间格式保持一致的问题 其次&#xff0c;另一个问题是&#xff0c;我们在使用WEB服务的时&#xff0c;可 能会需要用到&#xff0c;传入时间给后台&am…...

半监督学习 - 自训练(Self-training)

什么是机器学习 半监督学习中的自训练&#xff08;Self-training&#xff09;是一种利用已标记数据和未标记数据进行模型训练的方法。以下是自训练的详细教程&#xff1a; 步骤一&#xff1a;准备数据集 标记数据集&#xff1a; 收集和标记一小部分数据&#xff0c;用于有监…...

outlook邮件群发单显技巧?群发怎么单显?

outlook邮件群发单显如何设置&#xff1f;QQ邮箱怎么群发单显&#xff1f; 在群发邮件时&#xff0c;如何让每个收件人只看到自己的名字&#xff0c;而不是其他人的名字&#xff0c;这就涉及到所谓的“单显”技巧。下面蜂邮EDM就为大家揭秘Outlook邮件群发单显的奥秘。 outlo…...

做我的狗漫画网站/搜索网站有哪几个

第三份笔记了&#xff0c;今天要说的就是JavaScript中的控制语句了&#xff0c;也可以叫做决策语句&#xff0c;如if&#xff0c;else&#xff0c;switch等。 相信有编程基础的人看到这些并不陌生&#xff0c;因为每一种语言都会包含这些东西&#xff0c;也许名字不一样&#x…...

房地产网站建设公司推荐/天津百度快照优化公司

JavaScrip知识点总结一、JavaScript介绍二、JavaScript 和 html 代码的结合方式2.1 第一种方式2.2 第二种方式三、变量四、运算符4.1 关系&#xff08;比较&#xff09;运算符4.2 逻辑运算符五、数组六、函数6.1 函数的二种定义方式6.1.1 方式一6.1.2 方式二6.2 函数的 argumen…...

做网站设计的公司/如何建立自己的博客网站

点击上方 Java学习之道&#xff0c;选择 设为星标每天12点&#xff0c;干货准时奉上&#xff01;序微信的大版本更新一直都很佛,完全是看着工作组的心情来的。6.0版本2015年发布&#xff0c;7.0版本2018&#xff0c;最近又发布了微信的8.0版本。ios更新了8.0版本&#xff0c;可…...

做网站要和企业logo/市场营销推广方案怎么做

一、题目描述 给定一个二叉树和其中的一个结点&#xff0c;请找出中序遍历顺序的下一个结点并且返回。注意&#xff0c;树中的结点不仅包含左右子结点&#xff0c;同时包含指向父结点的指针。 二、解题思路 分三种情况&#xff1a; 1&#xff09;如果当前结点有右子树&#x…...

找人做一个网站多少钱/去除痘痘怎么有效果

有任何的书写错误、排版错误、概念错误等&#xff0c;希望大家包含指正。 在阅读本篇之前建议先学习&#xff1a; 【自然语言处理】Seq2Seq 讲解 Attention Mechanism 注意力机制源于对人类视觉的研究&#xff0c;注意力是一种人类不可或缺的复杂认知功能&#xff0c;指人可以…...

网站建设论文的前言/成都网站建设方案外包

简介CRC即循环冗余校验码(Cyclic Redundancy Check)&#xff1a;是数据通信领域中最常用的一种差错校验码&#xff0c;其特征是信息字段和校验字段的长度可以任意选定。CRC校验实用程序库在数据存储和数据通讯领域&#xff0c;为了保证数据的正确&#xff0c;就不得不采用检错的…...