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 语言在多态和面向对象方面的实现方式。如果有任何疑问或者建议,请随时在评论区留言。

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

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

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

相关文章

【速成Redis】03 Redis 五大高级数据结构介绍及其常用命令 | 消息队列、地理空间、HyperLogLog、BitMap、BitField

前言: 上篇博客我们讲到redis五大基本数据类型(也是就下图的第一列)。 【速成Redis】02 Redis 五大基本数据类型常用命令-CSDN博客文章浏览阅读1k次,点赞24次,收藏10次。该篇适用于速成redis。本篇我们将讲解&#…

探秘链表:十大经典题目全解析

目录 💯前言 💯常见链表题目类型 ⭐反转链表 ⭐合并两个有序链表 ⭐检测链表中是否存在环 ⭐找到链表的中间节点 ⭐删除链表中的节点 ⭐判断两个链表是否相交 ⭐找到链表中环的入口节点 ⭐复制带随机指针的链表 💯解题技巧与注意事…

Leetcode 2246. 相邻字符不同的最长路径(一般树)树形dp C++实现

问题:Leetcode 2246. 相邻字符不同的最长路径 给你一棵 树(即一个连通、无向、无环图),根节点是节点 0 ,这棵树由编号从 0 到 n - 1 的 n 个节点组成。用下标从 0 开始、长度为 n 的数组 parent 来表示这棵树&#x…

001.从0开始实现线性回归(pytorch)

000动手从0实现线性回归 0. 背景介绍 我们构造一个简单的人工训练数据集,它可以使我们能够直观比较学到的参数和真实的模型参数的区别。 设训练数据集样本数为1000,输入个数(特征数)为2。给定随机生成的批量样本特征 X∈R10002 …

【Delphi】扩展现有组件创建新的 FireMonkey 组件(步骤二)

实现指定格式的属性 步骤 1 中创建的 TClockLabel 组件需要在显示当前时间时定义日期时间格式作为属性,以便组件用户可以指定。 一、实现指定格式的属性 要实现格式属性,请在 TClockLabel class 的发布部分添加以下一行: property Form…

Mybatis-Plus使用例过程中BaseMapper中的一些selectList方法找不到的问题

如果需要用到Mybatis-Plus里面BaseMapper的默认实现的一些方法,而不通过mapper.xml的方式自定义方法,那么在构建SqlSessionFactory的时候需要注意应该通过Mybatis-Plus中的MybatisSqlSessionFactoryBean来获取SqlSessionFactory,使用Mybatis中…

CST电磁仿真77GHz汽车雷达保险杠

77G毫米波雷达仿真时,要考虑天线罩和保险杠的影响。通常保险杠都是多层结构,有的层非常薄。如果采用传统的3D建模方法,会导致网格数量巨大,进而影响到求解效率。 三维保险杠(bumper)模型如下图所示&…

vue3.5新特性

vue在2024.09.03发布了3.5正式版本,其中包含多方面的升级和优化 性能优化 响应式系统重构优化,在内存占用、性能方面均有收益 Memory Usage Improvements Given a test case with 1000 refs 2000 computeds (1000 chained pairs) 1000 effects sub…

【C++篇】探寻C++ STL之美:从string类的基础到高级操作的全面解析

文章目录 C string 类详解:从入门到精通前言第一章:C 语言中的字符串 vs C string 类1.1 C 语言中的字符串1.2 C string 类的优势 第二章:string 类的构造与基础操作2.1 string 类的构造方法2.1.1 示例代码:构造字符串 2.2 string…

二期 1.4 Nacos安装部署 - Window版

本文目录 Nacos支持三种部署模式环境准备下载Nacos启动登录服务注册与查看Nacos支持三种部署模式 单机模式 - 用于测试和单机试用。集群模式 - 用于生产环境,确保高可用。多集群模式 - 用于多数据中心场景。以 Window单机模式 抛转引玉,其它部署方式参考官方文档: https://n…

使用Python实现深度学习模型:智能电影制作与剪辑

随着人工智能技术的飞速发展,深度学习在各个领域的应用越来越广泛。在电影制作与剪辑领域,深度学习技术也展现出了巨大的潜力。本文将介绍如何使用Python实现一个简单的深度学习模型,用于智能电影制作与剪辑。我们将使用TensorFlow和Keras库来构建和训练模型,并展示如何应用…

部署自己的对话大模型,使用Ollama + Qwen2 +FastGPT 实现

部署资源 AUTODL 使用最小3080Ti 资源,cuda > 12.0使用云服务器,部署fastGPT oneAPI,M3E 模型 操作步骤 配置代理 export HF_ENDPOINThttps://hf-mirror.com下载qwen2模型 - 如何下载huggingface huggingface-cli download Qwen/Qwen2-…

Python编程入门指南

本文为初学者提供了全面的Python编程入门指南,涵盖了基础语法、控制结构、函数、数据结构、文件操作、异常处理、模块与包、面向对象编程以及一些高级特性,帮助读者快速掌握Python编程的核心知识。通过详细解释Python编程的各个方面,文章旨在…

flutter遇到问题及解决方案

目录 1、easy_refresh相关问题 2、 父子作用域关联问题 3. 刘海屏底部安全距离 4. 了解保证金弹窗 iOS端闪退 (待优化) 5. loading无法消失 6. dialog蒙版问题 7. 倒计时优化 8. scrollController.offset报错 9. 断点不走 10.我的出价报红 11…

Python3爬虫教程-HTTP基本原理

HTTP基本原理 1,URL组成部分详解2,HTTP和HTTPS3,HTTP请求过程4,请求(Request)请求方法(Request Method)请求的网址(Request URL)请求头(Request H…

Redmi Note 7 Pro(violet)免授权9008文件分享及刷机教程

获取文件 关注微信公众号 heStudio Community回复 violet_9008 获取下载链接。 刷机教程 下载搞机助手(可以从上方文件中获取)并安装。手机按音量减键和电源键进入 Fastboot 模式, 打开搞机助手,点击进入 9008 模式 等待手机…

IDEA 关闭自动补全功能(最新版本)

文章目录 一、前言二、关闭自动补全三、最终效果 一、前言 在最新的 IDEA 中发布了自动补全功能,当你输入代码时,IDEA 会自动显示你可能想输入的代码,减少手动输入的工作量,它会根据上下文提供正确的选项,提高代码的准…

Java-数据结构-二叉树-习题(三)  ̄へ ̄

文本目录: ❄️一、习题一(前序遍历非递归): ▶ 思路: ▶ 代码: ❄️二、习题二(中序遍历非递归): ▶ 思路: ▶ 代码: ❄️三、习题三(后序遍历非递归): ▶ 思路: …

C++——打印以下图案:用字符数组方法。

没注释的源代码 #include <iostream> using namespace std; int main() { char a[5]{*,*,*,*,*}; for(int i0;i<5;i) { for(int j0;j<i;j) { cout<<" "; } for(int k0;k<5;k) …

vue使用PDF.JS踩的坑--部署到服务器上显示pdf.mjs viewer.mjs找不到资源

之前项目使用的pdf.js 是2.15.349版本&#xff0c;最近换了一个4.6.82的版本&#xff0c;在本地上浏览文件运行的好好的&#xff0c;但是发布到服务器&#xff08;IIS&#xff09;上打不开文件&#xff0c;控制台提示找不到pdf.mjs viewer.mjs。 之前使用的2.15.349pdf和viewer…