Go 中的 OOP -组合而不是继承

Go不支持继承,但是它支持组合。组合的一般定义是“放在一起”。组合的一个例子是一辆汽车。汽车由车轮、发动机和各种其他部件组成。

通过嵌入结构进行组合

Go 中的组合可以通过将一种结构类型嵌入到另一种结构类型中来实现。

博客文章是写作的完美示例。每篇博客文章都有标题、内容和作者信息。这可以用组合来完美地表达。在本教程的后续步骤中,我们将了解这是如何完成的。

让我们首先创建author结构体。

package mainimport (  "fmt"
)type author struct {  firstName stringlastName  stringbio       string
}func (a author) fullName() string {  return fmt.Sprintf("%s %s", a.firstName, a.lastName)
}

在上面的代码片段中,我们创建了一个author包含 firstNamelastNamebio的结构体。同时我们还增加fullName的方法,该方法返回作者的全名。

下一步是创建blogPost结构。

type blogPost struct {  title     stringcontent   stringauthor
}func (b blogPost) details() {  fmt.Println("Title: ", b.title)fmt.Println("Content: ", b.content)fmt.Println("Author: ", b.author.fullName())fmt.Println("Bio: ", b.author.bio)
}

blogPost结构有字段title, content。它还具有嵌入的匿名字段author。该字段表示blogPost结构体由author 组成。

现在blogPoststruct 可以访问author结构的所有字段和方法。我们还在结构中添加了打印作者的标题、内容、全名和简介的details()方法。

每当一个结构体字段嵌入到另一个结构体字段中时,Go 都会为我们提供访问嵌入字段,就像它们是外部结构体的一部分一样。

这意味着p.author.fullName()可以替换为p.fullName(). 因此该details()方法可以重写如下,

func (p blogPost) details() {  fmt.Println("Title: ", p.title)fmt.Println("Content: ", p.content)fmt.Println("Author: ", p.fullName())fmt.Println("Bio: ", p.bio)
}

现在我们已经准备好了authorblogPost结构,让我们通过创建一篇博客文章来完成这个程序。

package mainimport (  "fmt"
)type author struct {  firstName stringlastName  stringbio       string
}func (a author) fullName() string {  return fmt.Sprintf("%s %s", a.firstName, a.lastName)
}type blogPost struct {  title   stringcontent stringauthor
}func (b blogPost) details() {  fmt.Println("Title: ", b.title)fmt.Println("Content: ", b.content)fmt.Println("Author: ", b.fullName())fmt.Println("Bio: ", b.bio)
}func main() {  author1 := author{"Naveen","Ramanathan","Golang Enthusiast",}blogPost1 := blogPost{"Inheritance in Go","Go supports composition instead of inheritance",author1,}blogPost1.details()
}

Run in playground

上面程序的主要功能是创建一个新作者和创建了一个新帖子。调用嵌入author.的details()方法

该程序打印,

Title:  Inheritance in Go  
Content:  Go supports composition instead of inheritance  
Author:  Naveen Ramanathan  
Bio:  Golang Enthusiast  

嵌入结构体切片

我们可以更进一步地使用这个示例,并使用一部分博客文章创建一个网站。

我们首先定义website结构体。请在现有程序的main函数上方添加以下代码并运行。

type website struct {  []blogPost
}
func (w website) contents() {  fmt.Println("Contents of Website\n")for _, v := range w.blogPosts {v.details()fmt.Println()}
}

当你添加上面的代码后运行上面的程序时,编译器会报以下错误,

main.go:31:9: syntax error: unexpected [, expecting field name or embedded type  

此错误指向 struct 的嵌入切片[]blogPost。原因是无法匿名嵌入切片。需要字段名称。因此,让我们修复这个错误,让编译器满意。

type website struct {  blogPosts []blogPost
}

我添加了blogPosts一个 slice字段[]blogPosts

现在让我们修改主要功能并为我们的新网站创建一些帖子。

下面给出修改main函数后的完整程序:

package mainimport (  "fmt"
)type author struct {  firstName stringlastName  stringbio       string
}func (a author) fullName() string {  return fmt.Sprintf("%s %s", a.firstName, a.lastName)
}type blogPost struct {  title   stringcontent stringauthor
}func (p blogPost) details() {  fmt.Println("Title: ", p.title)fmt.Println("Content: ", p.content)fmt.Println("Author: ", p.fullName())fmt.Println("Bio: ", p.bio)
}type website struct {  blogPosts []blogPost
}func (w website) contents() {  fmt.Println("Contents of Website\n")for _, v := range w.blogPosts {v.details()fmt.Println()}
}func main() {  author1 := author{"Naveen","Ramanathan","Golang Enthusiast",}blogPost1 := blogPost{"Inheritance in Go","Go supports composition instead of inheritance",author1,}blogPost2 := blogPost{"Struct instead of Classes in Go","Go does not support classes but methods can be added to structs",author1,}blogPost3 := blogPost{"Concurrency","Go is a concurrent language and not a parallel one",author1,}w := website{blogPosts: []blogPost{blogPost1, blogPost2, blogPost3},}w.contents()
}

Run in playground

在上面的 main 函数中,我们创建了一个作者author1和三个帖子post1,post2post3。最后创建了网站w

该程序将输出,

Contents of WebsiteTitle:  Inheritance in Go  
Content:  Go supports composition instead of inheritance  
Author:  Naveen Ramanathan  
Bio:  Golang EnthusiastTitle:  Struct instead of Classes in Go  
Content:  Go does not support classes but methods can be added to structs  
Author:  Naveen Ramanathan  
Bio:  Golang EnthusiastTitle:  Concurrency  
Content:  Go is a concurrent language and not a parallel one  
Author:  Naveen Ramanathan  
Bio:  Golang Enthusiast

本教程到此结束。祝你有美好的一天。请留下您的反馈和意见。

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

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

相关文章

CSS基础入门03

目录 1.圆角矩形 1.1基本用法 1.2生成圆形 1.3生成圆角矩形 1.4展开写法 2.Chrome 调试工具--查看 CSS 属性 2.1打开浏览器 2.2标签页含义 2.3elements 标签页使用 3.元素的显示模式 3.1块级元素 3.2行内元素/内联元素 3.3行内元素和块级元素的区别 3.4改变显示模…

负载均衡有哪些算法,分别在nginx中如何配置?

负载均衡是用于分发传入的网络流量到多个后端服务器的技术,以确保无单个服务器过载,从而提高应用的可用性和响应时间。以下是一些常用的负载均衡算法,以及如何在Nginx中配置它们: 轮询 (Round Robin): 简介&#xff1a…

数据结构和算法——用C语言实现所有排序算法

文章目录 前言排序算法的基本概念内部排序插入排序直接插入排序折半插入排序希尔排序 交换排序冒泡排序快速排序 选择排序简单选择排序堆排序 归并排序基数排序 外部排序多路归并败者树置换——选择排序最佳归并树 前言 本文所有代码均在仓库中,这是一个完整的由纯…

谁知道腾讯云轻量服务器“月流量”是什么意思?

腾讯云轻量服务器月流量什么意思?月流量是指轻量服务器限制每月流量的意思,不能肆无忌惮地使用公网,流量超额需要另外支付流量费,上海/广州/北京等地域的轻量服务器月流量不够用超额部分按照0.8元/GB的价格支付流量费。阿腾云aten…

DreamTexture.js - 基于稳定扩散的3D模型自动纹理化开发包

DreamTexture.js 是面向 three.js 开发者的 3D 模型纹理自动生成与设置开发包,可以为 webGL 应用增加 3D 模型的快速自动纹理化能力,官方下载地址:DreamTexture.js自动纹理化开发包 。 图一为原始模型, 图二图三为贴图后的模型。提示词&#…

uniapp 模仿 Android的Menu菜单栏

下面这张图就是我们要模拟的菜单功能 一、模拟的逻辑 1. 我们使用uni-popup组件&#xff08;记得要用hbuilder X导入该组件&#xff09;uni-app官网 2. 将组件内的菜单自定义样式 二、uniapp代码 写法vue3 <template><view><uni-popup ref"showMenu"…

前端将图片储存table表格中,页面回显

<el-table :data"tableData" v-loading"loading" style"width: 100%" height"calc(100vh - 270px)" :size"tableSize"row-dblclick"enterClick"><el-table-column prop"name" label"文档…

在Windows上安装Elasticsearch-8.x.x

前言 Elasticsearch 是一种流行的开源搜索和分析引擎&#xff0c;它提供了强大的全文搜索和实时数据分析功能&#xff0c;被广泛应用于各种领域&#xff0c;包括大数据分析、日志处理、企业搜索等。 一、下载 Elasticsearch 官方网站&#xff08;https://www.elastic.co/dow…

【PC】特殊空投-2023年10月

亲爱的玩家朋友们&#xff0c;大家好&#xff01; 10月特殊空投活动来袭。本月我们也准备了超多活动等着大家来体验。快来完成任务获得丰富的奖励吧&#xff01;签到活动&#xff0c;每周一次的PUBG空投节&#xff0c;还有可以领取PGC2023免费投票劵的活动等着大家&#xff01;…

调试AOSP源码的官方神器-Android Studio for Platform(ASfP)

文章目录 下载安装启动AOSP导入调试不足 欢迎关注微信公众号ZZH的Android 下载 下载地址平台版 Android Studio 由于该工具在调试源码时需要对AOSP进行编译&#xff0c;所以目前只有Ubuntu版本&#xff0c;后续应该也只会有Ubuntu版本。 Ubuntu环境下显示可下载 Windows系统…

python学习-Logistic回归与Softmax回归

图像分类数据集有CIFAR-10、ImageNet 应用&#xff1a;情感分类 关键&#xff1a;将样本x从文本形式转为向量形式 词袋模型&#xff08;Bag-of-Words&#xff0c;BoW&#xff09; 模型性能的评估指标 混淆矩阵&#xff08;confusion matrix&#xff09; 对于二分类问题&am…

ChinaSoft 论坛巡礼 | 智慧化 IDE 论坛

2023年CCF中国软件大会&#xff08;CCF ChinaSoft 2023&#xff09;由CCF主办&#xff0c;CCF系统软件专委会、形式化方法专委会、软件工程专委会以及复旦大学联合承办&#xff0c;将于2023年12月1-3日在上海国际会议中心举行。 本次大会主题是“智能化软件创新推动数字经济与社…

Leetcode 557 反转字符串中的单词 III 简单

题目 - 点击直达 1. 557 反转字符串中的单词 III 简单1. 题目详情1. 原题链接2. 题目要求3. 基础框架 2. 解题思路1. 思路分析2. 时间复杂度3. 代码实现 1. 557 反转字符串中的单词 III 简单 1. 题目详情 给定一个字符串 s &#xff0c;你需要反转字符串中每个单词的字符顺序…

中文编程开发语言工具系统化教程零基础入门篇和初级1专辑课程已经上线,可以进入轻松学编程

中文编程开发语言工具系统化教程零基础入门篇和初级1专辑课程已经上线&#xff0c;可以进入轻松学编程 学习编程捷径&#xff1a;&#xff08;不论是正在学习编程的大学生&#xff0c;还是IT人士或者是编程爱好者&#xff0c;在学习编程的过程中用正确的学习方法 可以达到事半…

SSH 无密登录设置

1 &#xff09; 配置 ssh &#xff08;1&#xff09;基本语法 ssh 另一台电脑的 IP 地址&#xff08;2&#xff09;ssh 连接时出现 Host key verification failed 的解决方法 [libaihadoop102 ~]$ ssh hadoop103 ➢ 如果出现如下内容 Are you sure you want to continue c…

Python学习笔记—元组

1、元组定义 元组使用&#xff08;&#xff09;来定义&#xff0c;元素在&#xff08;&#xff09;括号内&#xff0c;用逗号隔开 空元组定义&#xff0c;元组名&#xff08;&#xff09; 注&#xff1a;当元组只有1个元素的时候&#xff0c;需要在元素后面加逗号&#xff0c;…

基于物联网、大数据、云计算、人工智能等技术的智慧工地源码(Java+Spring Cloud +UniApp +MySql)

智慧工地是指利用物联网、大数据、云计算、人工智能等技术手段&#xff0c;为建筑施工现场提供智能硬件及物联网平台的解决方案&#xff0c;实现建筑工地的实时化、可视化、多元化、智慧化、便捷化。智慧工地的建设目标是实现全天候的管理监控&#xff0c;提高施工效率和质量&a…

电子电器架构 —— 车载网关初入门(二)

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 PS:小细节,本文字数5000+,详细描述了网关在车载框架中的具体性能设置。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他…

SV-10A-4G IP网络报警非可视终端 (4G版)

SV-10A-4G IP网络报警非可视终端 &#xff08;4G版&#xff09; https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.621e3d0dpv5knb&ftt&id745728046948 产品简介&#xff1a; 通过局域网/广域网网组网的网络报警系统&#xff0c;改变传统局域网组网…

pytorch代码复现1(基础知识)

创建矩阵 全零矩阵 In [4]: import torch torch.__version__ xtorch.empty(5,3) xOut[4]: tensor([[0.0000e00, 0.0000e00, 4.6430e-23],[1.4013e-45, 1.2612e-44, 0.0000e00],[3.5733e-43, 0.0000e00, 0.0000e00],[0.0000e00, 0.0000e00, 0.0000e00],[0.0000e00, 0.0000e00, 0…