⾯向对象编程:封装数据和⾏为、定义交互协议、扩展与复⽤ - GO语言从入门到实战

⾯向对象编程:封装数据和⾏为、定义交互协议、扩展与复⽤ - GO语言从入门到实战

⾯向对象编程:封装数据和⾏为、定义交互协议、扩展与复⽤ - GO语言从入门到实战

一、封装数据和⾏为

  1. 结构体定义

定义了一个名为Structural的结构体。结构体是一种用户自定义的数据类型,可以包含不同类型的字段(成员变量)。

与其他主要编程语⾔的差异:

//第⼀种定义⽅式在实例对应⽅法被调⽤时,实例的成员会进⾏值复制
func (e Structural) String() string {
return fmt.Sprintf("ID:%s-Name:%s-Age:%d", e.Id, e.Name, e.Age)
} 
//通常情况下为了避免内存拷⻉我们使⽤第⼆种定义⽅式
func (e *Structural) String() string {
return fmt.Sprintf("ID:%s/Name:%s/Age:%d", e.Id, e.Name, e.Age)
}
  1. 实例创建及初始化

使用该结构体类型来创建实例。在Go语言中,可以使用字面量方式创建结构体实例,并同时初始化字段的值。

func main() {  // 创建一个Structural结构体的实例,并初始化了Id、Name和Age字段的值。emp := Structural{  Id:   "456",  Name: "Jo Doe",  Age:  33,  }  //empPtr := new(Employee)  //还可以使用new关键字创建了一个指向Employee结构体的指针empPtr,然后通过指针访问和修改了结构体的字段。// 访问和输出结构体字段的值  fmt.Println("ID:", emp.Id)  fmt.Println("Name:", emp.Name)  fmt.Println("Age:", emp.Age)  
}

二、定义交互协议

  1. 接⼝与依赖

接⼝与依赖接口(interface)是一种定义行为的类型。接口定义了一个对象的行为,而不关心对象是什么类型。这种机制使得Go语言具有很强的灵活性和可扩展性。

接口的定义使用interface关键字,后面跟着接口名称和方法列表。

代码示例:

type Writer interface {  Write(data []byte) (int, error)  
}

上面的代码,定义了一个名为Writer的接口,它有一个Write方法,该方法接受一个字节切片并返回一个整数和一个错误。

接口可以被其他类型实现。一个类型实现了一个接口,意味着它实现了接口定义的所有方法。这使得在Go语言中可以通过接口来实现多态性。

例如,我们可以定义一个File类型,并让它实现Writer接口:

type File struct {  name string  
}  func (f *File) Write(data []byte) (int, error) {  // 实现Write方法的具体逻辑  return len(data), nil  
}

上面的代码,File类型实现了Writer接口,因为它提供了与Writer接口相同的Write方法。这样,我们就可以将File类型的对象赋值给Writer类型的变量,或者将Writer类型的变量赋值给File类型的变量,而不会出现编译错误。

依赖管理在Go语言中通常使用包(package)来实现。每个包都包含了一组相关的函数、类型和常量。通过导入包,我们可以使用包中的函数和类型。

Go语言的标准库提供了许多常用的包,例如fmt、os、io等。我们也可以创建自己的包,并在其他项目中导入使用。

依赖管理在Go语言中是非常简单的。我们只需要将依赖的包导入到我们的项目中即可。Go语言会自动解析并下载所有依赖的包。这使得Go语言的依赖管理非常方便和高效。

Go 接⼝

与其他主要编程语⾔的差异

  1. 接⼝为⾮⼊侵性,实现不依赖于借⼝定义:在Go语言中,接口是一种定义行为的方式,而不是定义类型的方式。这意味着实现接口的类或类型不需要显式地声明实现了某个接口,只要实现了接口定义的所有方法即可。
  2. 接口的定义可以包含在接口使用者包内:在Go语言中,接口的定义可以放在任何包内,包括接口使用者自己的包内。

接⼝变量
Go接口变量#### ⾃定义类型
要定义自定义类型,首先需要定义一个结构体类型,该结构体类型实现了接口中定义的所有方法。然后,可以使用结构体类型来创建该类型的对象,即自定义类型的实例。

下面是一个示例代码,演示了如何定义一个自定义类型并实现接口的方法:

package main  import "fmt"  // 定义接口  
type Shape interface {  Area() float64  Perimeter() float64  
}  // 定义结构体类型  
type Rectangle struct {  width, height float64  
}  // 实现接口的 Area 方法  
func (r Rectangle) Area() float64 {  return r.width * r.height  
}  // 实现接口的 Perimeter 方法  
func (r Rectangle) Perimeter() float64 {  return 2 * (r.width + r.height)  
}  func main() {  // 创建自定义类型的对象  rect := Rectangle{width: 5, height: 3}  // 使用接口的方法调用自定义类型的方法  fmt.Println("Area:", rect.Area())  fmt.Println("Perimeter:", rect.Perimeter())  
}

在上面的示例中,我们定义了一个Shape接口,该接口包含了Area()和Perimeter()两个方法。然后,我们定义了一个Rectangle结构体类型,并为其实现了这两个方法。通过创建Rectangle类型的对象rect,我们可以调用其实现的接口方法Area()和Perimeter()。



学习Go语言主要是多练,多找些代码段写写,不懂可以私聊咨询。
码字不易,如果该文章有用,请多多关注或者赞赏,谢谢!

欢迎关注云尔Websites CSDN博客

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

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

相关文章

150行代码实现一个极简的Canvas多功能画板

目录 1.前言2.多功能画板的实现2.1 画板初始化2.2 画笔2.3 橡皮擦2.4 清屏2.5 前进和后退 3.小结 1.前言 HTML5提供的Canvas标签能实现很多有趣的效果,本文就来分享一下如何使用Canvas来实现一个极简的多功能画板。先来看效果: 主要实现以下功能&…

深度学习之基于Pytorch卷积神经网络的图像分类系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介二、功能三、图像分类系统四. 总结 一项目简介 基于PyTorch卷积神经网络的图像分类系统是一种应用深度学习技术来实现图像分类任务的系统。本摘要将对该系统…

Qt QWidget、QDialog、QMainWindow的区别

QWidget QWidget是Qt框架中最基础的窗口类,可以理解为用户界面的最基本单元。QWidget类提供了一个空白窗口,可以通过继承该类来创建自定义的窗口类。QWidget类提供了基本的窗口属性和方法,如大小、位置、标题、图标等。 QDialog QDialog是…

多路IO—POll函数,epoll服务器开发流程

引言 "在计算机网络编程中,多路IO技术是非常常见的一种技术。其中,Poll函数和Epoll函数是最为常用的两种多路IO技术。这两种技术可以帮助服务器端处理多个客户端的并发请求,提高了服务器的性能。本文将介绍Poll和Epoll函数的使用方法&am…

TiDB x 北京银行丨新一代分布式数据库的探索与实践

导读 随着业务规模的扩大,传统数据库面临诸多限制,分布式数据库成为解决之道。本文 介绍了北京银行在数字化转型过程中对分布式数据库技术的探索,分享了 TiDB 在北京银行的应用历程和未来展望 。 本文根据北京银行软件开发中心罗水华先生在…

VS2019 C# mysql数据库使用EF

mysql 安装mysql-8.0.18-winx64 mysql-connector-net-8.0.18.msi mysql数据库.net开发驱动, 要在工程中引入connector安装后目录中的mysql.data.dll;如果直接在nutget中下载mysql.data.dll,那么就不用下载.net开发驱动包 mysql-for-visualstudio-1.…

设计模式_状态模式

状态模式 介绍 设计模式定义案例问题堆积在哪里解决办法状态模式一个对象 状态可以发生改变 不同的状态又有不同的行为逻辑游戏角色 加载不同的技能 每个技能有不同的:攻击逻辑 攻击范围 动作等等1 状态很多 2 每个状态有自己的属性和逻辑每种状态单独写一个类 角色…

Spring底层原理(四)

Spring底层原理(四) 本章内容 模拟实现Spring中的几个常见BeanFactory后置处理器 常见的BeanFactory后置处理器 GenericApplicationContext context new GenericApplicationContext(); context.registerBean("config",Config.class); context.registerBean(Conf…

YOLOv7优化:独家创新(Partial_C_Detect)检测头结构创新,实现涨点 | 检测头新颖创新系列

💡💡💡本文独家改进:独家创新(Partial_C_Detect)检测头结构创新,适合科研创新度十足,强烈推荐 SC_C_Detect | 亲测在多个数据集能够实现大幅涨点 收录: YOLOv7高阶自研专栏介绍: http://t.csdnimg.cn/tYI0c ✨✨✨前沿最新计算机顶会复现 🚀🚀🚀YOLO…

试题二(15分)和试题三(15分) (软件设计师笔记)

🏠个人主页:尘觉主页 🧑个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力😉 在csdn获奖荣誉: 🏆csdn城市之星2名 ⁣⁣⁣⁣ ⁣⁣⁣⁣ ⁣⁣⁣…

模糊C均值聚类(FCM)python

目录 一、模糊C均值聚类的原理 二、不使用skfuzzy的python代码 三、 使用skfuzzy的python代码 一、模糊C均值聚类的原理 二、不使用skfuzzy的python代码 import numpy as np import random import matplotlib.pyplot as plt plt.rcParams[font.sans-serif][SimHei] plt.r…

保障效率与可用,分析Kafka的消费者组与Rebalance机制

系列文章目录 上手第一关,手把手教你安装kafka与可视化工具kafka-eagle Kafka是什么,以及如何使用SpringBoot对接Kafka 架构必备能力——kafka的选型对比及应用场景 Kafka存取原理与实现分析,打破面试难关 防止消息丢失与消息重复——Kafka可…

【WinForm详细教程四】WinForm中的ProgressBar 、ImageList和ListView控件

文章目录 1.ProgressBar2. ImageList3.ListView控件 1.ProgressBar 用于显示某个操作的进度。 属性: Value: 表示当前进度条的值,其范围由Min和Max决定。Step: 设置每次调用PerformStep()方法时增加的步长。MarqueeAnimationSpeed: 在Style设置为Marq…

二叉树问题——前/中/后/层遍历问题(递归与栈)

摘要 博文主要介绍二叉树的前/中/后/层遍历(递归与栈)方法 一、前/中/后/层遍历问题 144. 二叉树的前序遍历 145. 二叉树的后序遍历 94. 二叉树的中序遍历 102. 二叉树的层序遍历 103. 二叉树的锯齿形层序遍历 二、二叉树遍历递归解析 // 前序遍历递归LC144_二叉树的前…

MySQL连接的原理⭐️4种优化连接的手段性能提升240%

MySQL连接的原理⭐️4种优化连接的手段性能提升240%🚀 前言 上两篇文章我们说到MySQL优化回表的三种方式:索引条件下推ICP、多范围读取MRR与覆盖索引 MySQL的优化利器⭐️索引条件下推,千万数据下性能提升273%🚀 MySQL的优化…

黄金矿工小游戏

欢迎来到程序小院 黄金矿工 玩法:点击开始游戏,黄金和钩子,钩子会左右摆动,对准黄金位置点击鼠标左键钓起黄金加对应时间,钓起黑色四块减去响应时间,快去挖矿吧^^。开始游戏https://www.ormcc.com/play/ga…

主播直播美颜SDK:提升颜值的秘诀

当下,主播们往往依赖于主播直播美颜SDK,这个技术工具为他们提供了一个让自己看起来更好看的机会。本文将深入探讨主播直播美颜SDK的工作原理、应用和影响,揭示提升颜值的秘诀。 一、主播直播美颜SDK是什么? 主播直播美颜SDK是一…

Latex排版SIGGRAPH总结(持续总结中...)

本文学习总结自:How to use the ACM SIGGRAPH / TOG LaTeX template 相关文件:百度网盘 首先解压 “my paper” 中的文件,并用Latex打开mypaper.tex. 多行连等公式 \begin{equation}表示编号公式,\[ \]表示无编号公式 无编号\b…

JMeter:断言之响应断言

一、断言的定义 断言用于验证取样器请求或对应的响应数据是否返回了期望的结果。可以是看成验证测试是否预期的方法。 对于接口测试来说,就是测试Request/Response,断言即可以针对Request进行,也可以针对Response进行。但大部分是对Respons…

精益制造的工具与方法有什么区别?ECRS工时分析软件的功能和价值

精益制造是一套价值创造系统,它强调在生产过程中减少浪费、提高效率和质量,从而实现持续改进和优化。在精益制造的理念下,企业需要运用一系列的工具和方法来提升生产管理水平。这些工具和方法不仅包括传统的精益工具,如5S、持续改…