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

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

相关文章

【数据结构】排序算法总结

⭐ 作者:小胡_不糊涂 🌱 作者主页:小胡_不糊涂的个人主页 📀 收录专栏:浅谈数据结构 💖 持续更文,关注博主少走弯路,谢谢大家支持 💖 总结 1. 归并排序2. 计数排序3. 排序…

【QT】事件过滤器

事件过滤器1、给控件安装过滤器 2、重写过滤器事件bool eventFilter(两个参数); 基于上一个项目:【QT】事件分发器-CSDN博客 我的代码有问题,不能实现事件过滤器的功能,先记录下来 在头文件中要声明该函数。 #include "widget.h"…

c语言从入门到实战——函数

函数 前言1. 函数的概念2. 库函数2.1 标准库和头⽂件2.2 库函数的使用方法2.2.1 功能2.2.2 头文件包含2.2.3 实践2.2.4 库函数文档的一般格式 3. 自定义函数3.1 函数的语法形式3.2 函数的举例 4. 形参和实参4.1 实参4.2 形参4.3 实参和形参的关系 5. return 语句6. 数组做函数参…

[SpringCloud] Feign 与 Gateway 简介

目录 一、Feign 简介 1、RestTemplate 远程调用中存在的问题 2、定义和使用 Feign 客户端 3、Feign 自定义配置 4、Feign 性能优化 5、Feign 最佳实践 6、Feign 使用问题汇总 二、Gateway 网关简介 1、搭建网关服务 2、路由断言工厂 3、路由的过滤器配置 4、全局过…

2023年免费CRM软件盘点:14款热门工具全面比较(含开源)

在初创企业或小型企业阶段,特别是在预算有限且客户管理需求较为基础的情境下,使用免费的CRM系统通常是一个理智的选择。这类系统虽然在功能上可能不如付费版本丰富,但基本的客户信息管理、销售跟踪和沟通记录等核心功能通常都能满足需求。 对…

SpringBootWeb案例——Tlias智能学习辅助系统(1)

目录 需求与准备环境搭建REST风格的API接口开发规范-统一响应结果 部门管理部门列表查询功能删除部门新增部门请求路径优化查询部门修改部门 员工管理分页查询分页插件PageHelper分页查询(带条件) (难点)删除员工 需求与准备 1、部门管理 包括: 查询部门列表 删除部…

微信小程序怎么制作?【小程序开发平台教学】

随着移动互联网的快速发展,微信小程序已经成为了人们日常生活中不可或缺的一部分。从购物、支付、出行到社交、娱乐、教育,小程序几乎涵盖了我们生活的方方面面。那么,对于有营销需求的企业商家来说,如何制作一个自己的微信小程序…

【DriveGPT学习笔记】自动驾驶汽车Autonomous Vehicle Planning

原文地址:DriveGPT - Lei Maos Log Book 自动驾驶汽车的核心软件组件是感知、规划和控制。规划是指在给定场景或一系列场景的情况下为自动驾驶汽车制定行动计划的过程,以实现安全和理想的自动驾驶。 用于规划的场景是从感知软件组件获得的。计划的行动将…

MongoDB——MongoDB删除系统自带的local数据库

一、MongoDB删除系统自带的local数据库 1.1、linux环境进入mongo客户端 输入 mongo 命令,进入命令行客户端 进入admin库,并登录,查看所有数据库 #进入admin库 use admin #并登录admin db.auth("username","password")…

【uniapp】html和css-20231031

我想用控件和样式来表达应该会更贴切,html和css的基础需要看看。 关于html:https://www.w3school.com.cn/html/html_layout.asp 关于css:https://www.w3school.com.cn/css/index.asp html让我们实现自己想要的布局(按钮&#xff0…

云栖大会:通义灵码智能编码助手,全面公测

文章目录 核心场景一、什么事通义灵码?二、功能介绍1.引入插件2.如何使用 总结 核心场景 代码智能生成 经过海量优秀开源代码数据训练,可根据当前代码文件及跨文件的上下文,为你生成行级/函数级代码、单元测试、代码注释等。沉浸式编码心流&…

牛客网刷题-(9)

🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如…