go语言基础 -- 面向对象编程

go语言面向对象编程思想

面向对象编程离不开封装、继承、多态三个特性,go语言与其他c++、java不太一样,没有类的概念,面向对象的实现也有些区别,下面分别描述。

go语言封装

  1. 结构体中字段如欲对外隐藏,首字母小写,对其的操作则通过结构体绑定的Set和Get函数进行;
  2. 结构体所在的包提供一个首字母大写的工厂模式函数用来创建对应的结构体对象,类似于构造函数;
  3. 实际上go里面的封装,已经融入到包、方法、函数里面了

go语言继承

在go语言中,如果一个结构体中嵌套了另一个匿名结构体对象,那么这个结构体可以直接访问这个匿名结构体的字段和方法(无论大小写),从而实现继承的特性。
例:

type Goods {Name stringPrice int
}
type Book struct {// 这里直接包含Goods结构体,那么Book的对象可直接访问Name和Price字段GoodsWriter string
}

在使用时,我们可以显式地调用Goods从而调用Goods相关的字段或方法,也可以直接隐式地调用,省略Goods:

mathbook := Book{}
mathbook.Goods.Name = "math"
mathbook.Goods.SetPrice(15) // 假设SetPrice是Goods绑定的方法
mathbook.Price = 20 // 这里可省略Goods
mathbook.Writer = "lzs"

当我们省略写法调用基类型的字段或方法时,编译器首先在当前类型中找有没有对应的字段或方法,有就调用,没有就看其嵌套的结构体有没有。若都找不到,则报错。若有多层嵌套,则会依次往上找。

必须显式地调用匿名结构体的场景:

  • 如果当前结构体有方法或字段与基类型的方法或字段相同,也是遵从就近原则,但如果这种场景我们就是想去调用基类型的方法或字段,那么就必须显式地调用匿名结构体名,如上面的Goods必须显式地调用;
  • 如果当前结构体嵌套了多个匿名结构体,且这些匿名结构体有共同的字段或方法,我们就需要通过显式调用来指定我们想要操作的具体字段或方法是属于哪一个结构体的;

在创建结构体变量时,也可以同时指定结构体的字段值,写法如下:

// 写法有顺序要求
mathbook := Book{Goods{"math", 15}}
// 或以下写法,无顺序要求
mathbook := Book{Name : "math",Price : 15,}

有多个匿名结构体依次写即可。

一些实际使用的细节:

  • 在嵌套匿名结构体时,也可以嵌套匿名结构体的指针,写法如下
type computer struct {*Goods
}
  • 除了结构体类型外,基本数据类型如int也可以写成匿名的方式,这时调用时需要包含类型:
type computer struct {*Goodsint
}func main() {huashuo := computer{}huashuo.int = 3000
}

匿名数据类型在同一个结构体中,只能有一个

  • 如果同时嵌套多个匿名结构体,也就是go语言中的多重继承的概念,通常为了调用的简洁性,go里面尽量避免多重继承。

多态

由于多态涉及到接口的概念,我们在下一个篇章来讲解

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

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

相关文章

JavaEE进阶(15)Spring原理:Bean的作用域、Bean的生命周期、Spring Boot自动配置(加载Bean、SpringBoot原理分析)

接上次博客:JavaEE进阶(14)Linux基本使用和程序部署(博客系统部署)-CSDN博客 目录 关于Bean的作用域 概念 Bean的作用域 Bean的生命周期 源码阅读 Spring Boot自动配置 Spring 加载Bean 问题描述 原因分析 …

Intellij IDEA 中 git 操作的快捷键

1.添加新建的文件 即add 操作 shift alt a 2.提交操作 即 commit操作 ctrl k 在窗口中可以用feature来声明此次更新的内容 3.提交操作 即push操作 ctrl shift k 4.拉去远程分支操作 即pull操作 ctrl t

国产 PD控制器产品-XS2103S&XS2103D&XS2104,兼容于IEEE 802.3 at/af

国产PD控制器产品-XS2103S&XS2103D&XS2104,兼容于IEEE 802.3 at/af 芯片特性 兼容于IEEE 802.3 at/af 2级事件分级 简易的墙上适配器接口 0至4级PoE分级 100V绝对最大额定输入 150mA最大浪涌电流限制 正常工作期间电流限制880mA 电流…

Spring学习 基础(三)MVC

5、Spring MVC 传统Web模式: Model:系统涉及的数据,也就是 dao 和 bean。View:展示模型中的数据,只是用来展示。Controller:处理用户请求都发送给 ,返回数据给 JSP 并展示给用户。 随着 Spring 轻量级开发…

C if 语句

一个 if 语句 由一个布尔表达式后跟一个或多个语句组成。 语法 C 语言中 if 语句的语法: if(boolean_expression) {/* 如果布尔表达式为真将执行的语句 */ }如果布尔表达式为 true,则 if 语句内的代码块将被执行。如果布尔表达式为 false,…

poll开发服务器

int poll(struct pollfd *fds, nfds_t nfds, int timeout); 函数说明:与select类似,委托内核监控可读,可写,异常事件。 函数说明: fds:一个struct pollfd结构体数组的首地址 struct pollfd { …

天猫淘宝详情接口API揭秘:实现个性化商品推荐!

天猫淘宝作为中国最大的电商平台,拥有庞大的商品库存和众多用户,为了提高用户购物体验并满足其个性化需求,天猫淘宝推出了详情接口API,通过智能算法实现个性化商品推荐。联讯数据将为您揭秘详情接口API的实现原理和功能。 个性化商…

信息抽取在旅游行业的应用:以景点信息抽取为例

开源项目推荐 今天先给大家推荐一个开源项目,多模态AI能力引擎平台: 免费的自然语言处理、情感分析、实体识别、图像识别与分类、OCR识别、语音识别接口,功能强大,欢迎体验。 https://gitee.com/stonedtx/free-nlp-api 场景描述 在旅游行业…

【新书推荐】17.3 字符串操作举例

本节内容:字符串操作举例。 ■例3:接收字符串去掉空格后逆向输出,t17-3.asm。 ■例4:字符串拼接,t17-4.asm。 ■例5:判断子串,t17-5.asm。 17.3.1 例3:接收字符串去掉空格后逆向输出…

如何关闭 Visual Studio 双击高亮

[问题描述]: 最近 Visual Studio 更新后,双击选中关键字快要亮瞎我的眼睛了 👀👀 [解决方法]: 摸索了一下,找到了关闭的方法:工具 → 选项 → 文本编辑器 → 常规,然后取消 勾选 sel…

蓝桥杯-串的处理,幸运数字

参照大佬写法: #include<iostream> #include<cstring> using namespace std; int main(){string str;getline(cin,str);//可以将带有空格的string输入for(int i0;i<str.size();i){if(i0&&str[i]>a&&str[i]<z) str[i]-32;//单词首字母小…

JavaScript输出

JavaScript 显示方案 JavaScript 能够以不同方式"显示"数据&#xff1a; 使用 window.alert() 写入警告框使用 document.write() 写入 HTML 输出使用 innerHTML 写入 HTML 元素使用 console.log() 写入浏览器控制台 使用 innerHTML 如需访问 HTML 元素&#xff0c…

python知网爬虫论文pdf下载+立即可用(动态爬虫)

文章目录 使用代码 使用 自己工作需要&#xff0c;分享出来&#xff0c;刚刚修改完。 知需要修改keyword就可以完成自动搜索和下载同时翻页。 但是需要安装Chrome&#xff0c;也支持linux爬虫&#xff0c;也要安装linux Chrome非可视化版。 代码 import selenium.webdriver …

如何使用LEAKEY轻松检测和验证目标服务泄露的敏感凭证

关于LEAKEY LEAKEY是一款功能强大的Bash脚本&#xff0c;该脚本能够检测和验证目标服务中意外泄露的敏感凭证&#xff0c;以帮助广大研究人员检测目标服务的数据安全状况。值得一提的是&#xff0c;LEAKEY支持高度自定义开发&#xff0c;能够轻松添加要检测的新服务。 LEAKEY主…

【unity小技巧】Unity人物衣服布料系统的探究 —— Cloth组件

文章目录 一、Cloth组件解释基本介绍出于性能的考虑, 可以对Cloth产生影响的Collider只有两种打开编辑模式绘制 二、基本使用1. 创建出一个空物体2. 在空物体上添加cloth组件&#xff0c;可以直接点击Add Component搜索cloth添加&#xff0c;也可以在工具栏 Component–>phy…

Android UI自动化测试框架—SoloPi简介

1、UI自动化测试简介 软件测试简介 ​软件测试是伴随着软件开发一同诞生的&#xff0c;随着软件规模大型化&#xff0c;结构复杂化&#xff0c;软件测试也从最初的简单“调试”&#xff0c;发展到当今的自动化测试。 ​ 自动化测试是什么呢&#xff1f;自动化测试是把以人为…

图分割 Graph Partition 学习笔记1

文章目录 前言一、graph-partition是什么&#xff1f;二、具体分类三、graph-partition的意义参考链接 前言 最近在学习图论划分的方法&#xff0c;碰巧搜索到了这个算是对我而言全新的一个体系&#xff0c;在这里将逐步记载自己的学习资料和进度&#xff0c;希望和大家一起探讨…

4.4 不要循环的二维图片的卷积核的均值运算(python)

代码如下&#xff1a; import numpy as np import cv2def Binarization(a, keras):x1 keras[0] // 2x2 keras[0] - x1y1 keras[1] // 2y2 keras[1] - y1 - 1bs a.copy()# #给数组添加列&#xff1a;前面添加y2列&#xff0c;后面添加y1列# #1.后面添加y1列求和for i in r…

HAProxy集群与常见的Web集群软件调度器对比

一.常见的Web集群调度器 Web集群调度器分为软件和硬件&#xff1a; 1.常用软件调度器&#xff1a; &#xff08;1&#xff09;LVS&#xff1a;性能最好&#xff0c;搭建复杂 &#xff08;2&#xff09;Nginx&#xff1a;性能较好&#xff0c;但集群节点健康检查功能呢不强&…

Rust教程:How to Rust-从开始之前到Hello World

本文为第0篇 专栏简介 本专栏是优质Rust技术专栏&#xff0c;推荐精通一门技术栈的蟹友&#xff0c;不建议基础的同学&#xff08;无基础学Rust也是牛人[手动捂脸]&#xff09; 感谢Rust圣经开源社区的同学&#xff0c;为后来者提供了非常优秀的Rust学习资源 本文使用&…