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

news2024/11/30 12:32:54

⾯向对象编程:封装数据和⾏为、定义交互协议、扩展与复⽤ - 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.coloradmin.cn/o/1159488.html

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

相关文章

【Unity编辑器扩展】艺术字/自定义图片字体生成工具

艺术字在游戏中很常用,由于普通字体样式过于平淡,制作花里胡哨的文字图片作为游戏字体使用,这就是艺术字。 不依赖第三方工具,仅使用Unity自带的Custom Font 一张艺术字图集就能实现这个功能,但是为了便于使用&#…

多伦多公共图书馆遭遇周末网络攻击,服务中断

多伦多公共图书馆(TPL)在10月28日星期六遭遇网络攻击后,警告称其许多在线服务已经中断。 作为加拿大最大的公共图书馆系统,TPL通过多伦多市内的100个分馆为人们提供1200万本图书的借阅服务。图书馆拥有120万注册会员,…

[SpringCloud | Linux] CentOS7 部署 SpringCloud 微服务

目录 一、环境准备 1、工具准备 2、虚拟机环境 3、Docker 环境 二、项目准备 1、配置各个模块(微服务)的 Dockerfile 2、配置 docker-compose.yml 文件 3、Maven 打包 4、文件整合并传输 三、微服务部署 1、部署至 Docker 2、访问微服务 四…

【Verilog】7.2.1 Verilog 并行 FIR 滤波器设计

FIR(Finite Impulse Response)滤波器是一种有限长单位冲激响应滤波器,又称为非递归型滤波器。 FIR 滤波器具有严格的线性相频特性,同时其单位响应是有限长的,因而是稳定的系统,在数字通信、图像处理等领域…

MacOS安装git

文章目录 通过Xcode Command Lines Tool安装(推荐)终端直接运行git命令根据流程安装先安装Command Lines Tool后再安装git 官网下载二进制文件进行安装官方国外源下载二进制文件(不推荐)国内镜像下载二进制文件(推荐)安装git 通过Xcode Command Lines Tool安装(推荐) 简单来讲C…

性能压力测试主要目标及步骤

性能压力测试是软件开发生命周期中至关重要的一部分,旨在评估应用程序或系统在高负载和极端条件下的性能表现。这种测试有助于发现性能瓶颈、资源耗尽和错误,以确保应用程序在真实使用情况下的可靠性和稳定性。本文将探讨性能压力测试的概念、方法和最佳…

Distribution-Aware Coordinate Representation for Human Pose Estimation阅读笔记

主要研究人体姿态估计中heatmap转坐标的方法,提出一种新的解码方法 (其实这人体姿态我毛也不会,过来看看这个heatmap解码方法) 代码:https://github.com/ilovepose/DarkPose/blob/master/lib/core/inference.py 方法…

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

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

YOLOv5 分类模型的预处理

YOLOv5 分类模型的预处理 flyfish 版本 6.2 将整个代码简化成如下代码 imgsz224 file "/home/a/Pictures/1.jpg" transforms classify_transforms(imgsz) im cv2.cvtColor(cv2.imread(file), cv2.COLOR_BGR2RGB) print(im.shape)im transforms(im) print(im.…

【计算机网络】第二章:应用层

应用层协议原理 客户-服务器体系结构: 特点:客户之间不能直接通信;服务器具有周知的,固定的地址,该地址称为IP地址。 配备大量主机的数据中心常被用于创建强大的虚拟服务器;P2P体系结构: 特点&…

项目压测优化

基本信息 客户名称:xxx 产品名称:ATS 版本号:版本无关 问题分类:性能问题 问题描述 压测付款查询和收款查询接口,发现cpu过高,响应时间过长不符合要求。 客户要求:1500并发情况下,接…

BUUCTF 后门查杀 1

BUUCTF:https://buuoj.cn/challenges 题目描述: 小白的网站被小黑攻击了,并且上传了Webshell,你能帮小白找到这个后门么?(Webshell中的密码(md5)即为答案)。 密文: 下载附件,解压得到一个网站文件夹。 解…

呼吸灯【FPGA】

晶振50Mhz 1us 等于 计0~49 1ms等于 0~999us 1s等于 0~999ms //led_outalways(posedge FPGA_CLK_50M_b5 or negedge reset_e8) //【死循环】敏感【触发条件:上升沿 clk】【运行副本】if(reset_e81b0)begin //50Mhz晶振, 49_999_999 是 1秒…

畅销书《Kali Linux高级渗透测试》更新版速速查收~

懒大王感谢大家的关注和三连支持~ 作者简介: 懒大王敲代码,正在学习嵌入式方向有关课程stm32,网络编程,数据结构C/C等 今天给大家推荐畅销书《Kali Linux高级渗透测试》,希望大家能觉得实用! 欢迎大家点赞…

10.30寄存器,寄存器堆

寄存器 8位环形移位寄存器 module shift_regist (input wire clk,input wire rstn,input wire [7:0]D,output reg [7:0]Q ); always (posedge clk or negedge rstn) beginif(!rstn)Q<8b000000;elseQ<{D[6:0],D[7]} ; end endmodule //shift_regist 输入有时钟…

Qt入门日记1

目录 1.Qt简介和案例 2.第一个Qt程序 3.学会查看帮助文档 4.创建一个按钮 5.对象树简介 6.Qt的坐标系 7. 信号和槽 7.1自定义信号和槽 7.2信号连接信号 7.3拓展 7.4Qt4版本以前的connect 1.Qt简介和案例 Qt是一个跨平台的C图形用户界面应用程序框架(就是一个库吧…

2024“点点点”测试员如何上岸测试开发岗?附完整学习路线!

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

干货分享 | 一分钟带你了解TSMaster小程序编辑代码智能提示功能

本文给大家带来TSMaster小程序编辑的新功能&#xff0c;其中主要包含&#xff1a;代码编辑智能提示功能、可用外部代码编辑器编辑小程序代码并同步。 本文关键字&#xff1a;C小程序、Python小程序、代码智能提示、外部代码编辑器、Visual Studio 目录/Catalog ● TSMaster的…

11月1日星期三今日早报简报微语报早读

11月1日星期三&#xff0c;农历九月十八&#xff0c;早报微语早读分享。 1、神舟十六号航天员乘组平安抵京&#xff1b; 2、微信/抖音/B站等平台&#xff1a;将推动50万粉以上“自媒体”账号实名信息展示&#xff1b; 3、第三批鼓励仿制药品建议目录公示&#xff0c;包括抗癌…