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

golang学习笔记28——golang中实现多态与面向对象

  • 推荐学习文档
    • golang应用级os框架,欢迎star
    • golang应用级os框架使用案例,欢迎star
    • 案例:基于golang开发的一款超有个性的旅游计划app经历
    • golang实战大纲
    • golang优秀开发常用开源库汇总
    • 想学习更多golang知识,这里有免费的golang学习笔记专栏

文章目录

    • 前言
    • Go 语言中的接口实现多态
      • 1.定义接口
      • 2.实现接口的结构体
      • 3.多态的体现
    • Go 语言中的面向对象特性
      • 1.封装
      • 2.组合代替继承
    • 总结

前言

Go 语言并不是传统意义上的面向对象编程语言,但它通过一些独特的方式实现了类似面向对象编程(OOP)的特性,其中包括多态的实现。本文将详细介绍在 Go 语言中如何实现多态以及面向对象相关概念。

Go 语言中的接口实现多态

在 Go 语言中,接口是实现多态的关键。接口定义了一组方法,但不实现这些方法。任何类型只要实现了接口中定义的所有方法,就被认为实现了该接口。

1.定义接口

以下是一个简单的接口定义:

type Shape interface {Area() float64Perimeter() float64
}

2.实现接口的结构体

我们定义两个结构体 Rectangle 和 Circle 并让它们实现 Shape 接口:

type Rectangle struct {width  float64height float64
}func (r Rectangle) Area() float64 {return r.width * r.height
}func (r Rectangle) Perimeter() float64 {return 2*(r.width + r.height)
}type Circle struct {radius float64
}func (c Circle) Area() float64 {return 3.14 * c.radius * c.radius
}func (c Circle) Perimeter() float64 {return 2 * 3.14 * c.radius
}

3.多态的体现

通过接口类型的变量,我们可以调用不同实现类型的方法,这体现了多态性:

func main() {var s Shaper := Rectangle{width: 5, height: 3}s = rfmt.Println("Rectangle Area:", s.Area())fmt.Println("Rectangle Perimeter:", s.Perimeter())c := Circle{radius: 4}s = cfmt.Println("Circle Area:", s.Area())fmt.Println("Circle Perimeter:", s.Perimeter())
}

Go 语言中的面向对象特性

1.封装

在 Go 语言中,通过将结构体的字段小写(在 Go 中,小写字母开头的标识符在包外不可见)来实现封装,这样可以控制对内部数据的访问。例如:

package mainimport "fmt"type Person struct {name stringage  int
}func NewPerson(name string, age int) *Person {return &Person{name: name, age: age}
}func (p *Person) GetName() string {return p.name
}func (p *Person) SetName(newName string) {p.name = newName
}func main() {p := NewPerson("Alice", 30)fmt.Println(p.GetName())p.SetName("Bob")fmt.Println(p.GetName())
}

2.组合代替继承

Go 语言没有继承的概念,而是通过组合来实现代码复用。例如:

type Animal struct {Name string
}func (a *Animal) Move() {fmt.Printf("%s is moving\n", a.Name)
}type Dog struct {AnimalBreed string
}func main() {dog := Dog{Animal{"Doubao"}, "Poodle"}dog.Move()
}

总结

虽然 Go 语言不是纯粹的面向对象语言,但它通过接口、封装和组合等特性,提供了一种灵活且高效的编程方式来实现多态和面向对象相关的编程模式。这些特性使得 Go 语言在复杂系统的构建中能够满足各种设计需求,同时保持了语言的简洁性和高效性。

希望这篇文章能够帮助大家更好地理解 Go 语言在多态和面向对象方面的实现方式。如果有任何疑问或者建议,请随时在评论区留言。

关注我看更多有意思的文章哦!👉👉

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 摄影社团管理系统
  • MySQL-DQL(数据查询语言)
  • Avalonia第三方UI库Semi.Avalonia用法详解
  • 数据库数据恢复—SQL Server附加数据库出现“错误823”怎么恢复数据?
  • 在Windows系统上安装的 zstd C++ 库
  • 面试知识点总结篇一
  • 【Android】模糊搜索与数据处理
  • 缓存装饰器@cached_property
  • 如何解决哈希冲突?
  • 828华为云征文 | 云服务器Flexus X实例:RAG 开源项目 FastGPT 部署,玩转大模型
  • 算法揭秘:时间复杂度与空间复杂度的实用指南
  • Docker:解决开发运维问题的开源容器化平台
  • 使用python写按键程序
  • 产品经理面试整理-准备个人案例
  • MySQL关卡任务书
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • [译]如何构建服务器端web组件,为何要构建?
  • CODING 缺陷管理功能正式开始公测
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • k8s如何管理Pod
  • PAT A1050
  • python学习笔记 - ThreadLocal
  • Redis在Web项目中的应用与实践
  • uni-app项目数字滚动
  • 百度地图API标注+时间轴组件
  • 番外篇1:在Windows环境下安装JDK
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 漂亮刷新控件-iOS
  • 使用putty远程连接linux
  • 为视图添加丝滑的水波纹
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ​人工智能书单(数学基础篇)
  • # C++之functional库用法整理
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (java)关于Thread的挂起和恢复
  • (vue)页面文件上传获取:action地址
  • (二)springcloud实战之config配置中心
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (附源码)计算机毕业设计高校学生选课系统
  • (精确度,召回率,真阳性,假阳性)ACC、敏感性、特异性等 ROC指标
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (十八)Flink CEP 详解
  • (十一)图像的罗伯特梯度锐化
  • (一)、软硬件全开源智能手表,与手机互联,标配多表盘,功能丰富(ZSWatch-Zephyr)
  • (转) 深度模型优化性能 调参
  • (转)EXC_BREAKPOINT僵尸错误
  • .net core 使用js,.net core 使用javascript,在.net core项目中怎么使用javascript
  • .Net OpenCVSharp生成灰度图和二值图
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .NET 使用配置文件
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)