golang学习笔记21-面向对象(三):封装与继承【重要】

news2024/9/30 5:31:19

本节也是GO核心部分,很重要。
注:本人已有C,C++,Python基础,只写本人认为的重点。由于导包语句已经在19讲(笔记19:面向对象的引入)展示过了,所以这里就不展示了。

一、封装

【1】什么是封装:
封装(encapsulation)就是把抽象出的字段和对字段的操作封装在一起,数据被保护在内部程序的其它包只有通过被授权的操作方法,才能对字段进行操作。
【2】封装的好处:
1)隐藏实现细节
2)提可以对数据进行验证,保证安全合理
【3】Golang中如何实现封装:
1)建议将结构体、字段(属性)的首字母小写(其它包不能使用,类似private,实际开发不小写也可能,因为封装没有那么严格)
2)给结构体所在包提供一个工厂模式的函数,首字母大写(类似一个构造函数)
3)提供一个首字母大写的Set方法(类似其它语言的public),用于对属性判断并赋值func (var结构体类型名)SetXxx(参数列表){//加入数据验证的业务逻辑var.Age =参数
}
4)提供一个首字母大写的Get方法(类似其它语言的public),用于获取属性的值func (var结构体类型名)GetXxx()(返回值列表){
return var.字段;
}
示例:
在utils中定义结构体和方法:

type person struct {
	Name string
	age  int //其他包不能直接访问
}

//相当于构造器
func NewPerson(name string) *person {
	return &person{
		Name: name,
	}
}

func (p *person) SetAge(age int) {
	if age < 0 || age > 150 {
		fmt.Println("请输入合理的年龄!")
		return
	}
	p.age = age
}
func (p *person) GetAge() int {
	return p.age
}

然后在main中调用:

func main() {
	// 使用构造器创建一个新的 person 实例
	p := utils.NewPerson("李华")

	// 设置年龄
	p.SetAge(30)

	// 获取年龄并打印
	fmt.Printf("姓名: %s, 年龄: %d\n", p.Name, p.GetAge())

	// 尝试设置不合理的年龄
	p.SetAge(200) // 输出: 请输入合理的年龄!

	// 再次获取年龄并打印
	fmt.Printf("姓名: %s, 年龄: %d\n", p.Name, p.GetAge())
}

二、继承

继承的概念和C++一样,就不做赘述了,但GO其实是弱化了这个概念,没有专门的机制来实现继承,具体来说,没有父类子类的概念,没有继承关键字,但可以通过匿名结构体实现。首先,在utils中定义结构体和方法:

type Animal struct {
	Age    int
	Weight float64
}

func (a *Animal) ShowInfo() {
	fmt.Println("年龄=", a.Age, "体重=", a.Weight)
}
func (a *Animal) Shout() {
	fmt.Println("我是动物,我会喊叫")
}

//用Animal是为了提高复用性,显然Cat是Animal的子类
type Cat struct {
	Animal
}

func (c *Cat) Scratch() {
	fmt.Println("我是小猫,我可以挠人")
}

这里cat中的animal显然就是匿名结构体,即没有名字,只有类型的结构体,属于cat的父类。
定义好子类和父类后,在main中调用:

func main() {
	c := &utils.Cat{}
	//方式1
	c.Animal = utils.Animal{Age: 3, Weight: 10.6}
	// 方式2:c.Animal.Age, c.Animal.Weight = 3, 10.6
	c.Animal.ShowInfo()
	c.Animal.Shout()
	c.Scratch()
}

一些细节:
【1】结构体可以使用嵌套匿名结构体所有的字段和方法,即:首字母大写或者小写的字段、方法,都可以使用。读者可自行尝试,这里不做赘述。
【2】匿名结构体字段访问可以简化。例:

func main() {
	c := &utils.Cat{}
	c.Age, c.Weight = 3, 10.6
	c.ShowInfo()
	c.Shout()
	c.Scratch()
}

上述程序输出和通过animal访问是一样的,这证明了子类完全继承了父类的方法和字段,这样使用起来就方便很多。
【3】当结构体和匿名结构体有相同的字段或者方法时,编译器采用就近原则访问,如希望访问匿名结构体的字段和方法,可以通过匿名结构体名来区分。这句话说白了就是子类和父类变量冲突,比如cat也有一个Age,优先用子类的,如果仍然想用父类的,那么字段访问就不能简化,要显示调用父类。读者可自行尝试,这里不做赘述。
【4】 Golang中支持多继承:如一个结构体嵌套了多个匿名结构体,那么该结构体可以直接访问嵌套的匿名结构体的字段和方法,从而实现了多重继承。为了保证代码的简洁性,建议大家尽量不使用多重继承,很多语言就将多重继承去除了,但是Go中保留了。多重继承的示例如下:

type A struct {
	Aa int
	Ab string
}
type B struct {
	Bc int
	Bd string
	Aa int
}
type C struct {
	A
	B
}

C的创建语句是c:=C{A{},B{}}
显然,C有两个父类,更多测试代码就不写了。
【5】如嵌入的匿名结构体有相同的字段名或者方法名,则在访问时,需要通过匿名结构体类型名来区分。比如上一点的A和B中有相同字段,那么和第三点一样,显示调用父类即可。
【6】结构体的匿名字段可以是基本数据类型。也就是说,可以在子类里面写int,float等基本数据类型,调用时就类似c.int,c.float64,…,这个了解即可。
【7】嵌入匿名结构体的指针也是可以的。如果嵌入指针,比如cat里面嵌入*animal,那么创建cat时,要在animal前加取地址符&(与号),使用时用*解引用即可。
【8】结构体的字段可以是结构体类型的(组合模式)。这个其实就是二重结构体,除了访问时还可以再“点”一下,和其他类型没什么区别,当然,这不是继承。示例:
utils内的定义:

type D struct {
	Da int
	Db string
	Dc B //组合模式
}

main中的调用:

func main() {
	d := utils.D{10, "ooo", utils.B{66, "ppp", 99}}
	fmt.Println(d)
	fmt.Println(d.Dc.Bd)
}

程序输出为:

{10 ooo {66 ppp 99}}
ppp

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

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

相关文章

DL_语义分割(学习笔记)

文章目录 图像分割1 常见分类1.1 语义分割1.2 实例分割1.3 全景分割 2 语义分割2.1 模型评价指标2.2 常用数据集2.3 转置卷积2.4 膨胀卷积2.5 感受野2.6 双线性插值2.7 FCN 图像分割 1 常见分类 1.1 语义分割 定义&#xff1a;【只判断类别&#xff0c;无法区分个体】 语义分…

Matlab实现麻雀优化算法优化回声状态网络模型 (SSA-ESN)(附源码)

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1内容介绍 麻雀搜索算法&#xff08;Sparrow Search Algorithm, SSA&#xff09;是一种新兴的群体智能优化算法&#xff0c;灵感来源于麻雀的觅食行为及其在面临危险时的预警机制。SSA通过模拟麻雀的这些自然行为来寻找问题…

[Docker学习笔记]利用Dockerfile创建镜像

Dockerfile 指令 指令作用from继承基础镜像maintainer镜像制作者信息(可缺省)run用来执行shell命令expose暴露端口号cmd启动容器默认执行的命令entrypoint启动容器真正执行的命令volume创建挂载点env配置环境变量add复制文件到容器copy复制文件到容器workdir设置容器的工作目录…

蓝卓亮相中国工博会,打造以数据驱动的智能工厂

9月28日&#xff0c;以“工业聚能&#xff0c;新质领航”为主题的第24届中国国际工业博览会&#xff08;以下简称“工博会”&#xff09;在国家会展中心&#xff08;上海&#xff09;圆满拉下帷幕。本届工博会共设9大专业展区&#xff0c;吸引了来自全球28个国家和地区的2600余…

针对考研的C语言学习(定制化快速掌握重点4)

typedef的使用 简化变量类型 逻辑结构 集合结构&#xff1a;无关系 线性结构&#xff1a;一对一 树形结构&#xff1a;一对多 图形结构&#xff1a;多对多 存储结构 顺序存储和链式存储&#xff08;考代码&#xff09; 顺序存储优点&#xff1a;1.可以实现随机存取。2.…

针对考研的C语言学习(定制化快速掌握重点5)

顺序表 特点&#xff1a; 写代码主要就是增删改查&#xff01;&#xff01;&#xff01; 写代码的边界性非常重要以及考研插入和删除的位置都是从1开始&#xff0c;而数组下标是从0开始 【注】下标和位置的关系 线性表最重要的是插入和删除会涉及边界问题以及判断是否合法 …

【Spring Boot 入门二】Spring Boot中的配置文件 - 掌控你的应用设置

一、引言 在上一篇文章中&#xff0c;我们开启了Spring Boot的入门之旅&#xff0c;成功构建了第一个Spring Boot应用。我们从环境搭建开始&#xff0c;详细介绍了JDK的安装以及IDE的选择与配置&#xff0c;然后利用Spring Initializr创建了项目&#xff0c;分析了项目结构&am…

资质申请中常见的错误有哪些?

在申请建筑资质的过程中&#xff0c;企业可能会犯一些常见的错误&#xff0c;以下是一些需要避免的错误&#xff1a; 1. 资料准备不充分&#xff1a; 申请资质需要提交大量的资料&#xff0c;包括企业法人资料、财务报表、业绩证明等。资料不齐全或不准确都可能导致申请失败。…

多线程(一):线程的基本特点线程安全问题ThreadRunnable

目录 1、线程的引入 2、什么是线程 3、线程的基本特点 4、线程安全问题 5、创建线程 5.1 继承Thread类&#xff0c;重写run 5.1.1 创建Thread类对象 5.1.2 重写run方法 5.1.3 start方法创建线程 5.1.4 抢占式执行 5.2 实现Runnable&#xff0c;重写run【解耦合】★…

MySQL-数据库设计

1.范式 数据库的范式是⼀组规则。在设计关系数据库时&#xff0c;遵从不同的规范要求&#xff0c;设计出合理的关系型数 据库&#xff0c;这些不同的规范要求被称为不同的范式。 关系数据库有六种范式&#xff1a;第⼀范式&#xff08;1NF&#xff09;、第⼆范式&#xff08;…

【Mysql】SQL语言基础

1、SQL的概述 SQL全称&#xff1a;Structured Query Language,是结构化查询语言&#xff0c;用于访问和处理数据库的标准的计算机语言。SQL语言1974年由Boyce和Chamberlin提出&#xff0c;并首先在IBM公司研制的关系数据库系统systemr上实现。 美国国家标准局&#x…

亚信安全发布第34期《勒索家族和勒索事件监控报告》

本周态势快速感知 本周全球共监测到勒索事件91起&#xff0c;近三周勒索事件数量较为稳定。从整体上看&#xff0c;Ransomhub是影响最严重的勒索家族&#xff1b;Play和ElDorado恶意家族也是两个活动频繁的恶意家族&#xff0c;需要注意防范。本周&#xff0c;土耳其公司巴克皮…

小红书2024秋招后端开发(Java工程师、C++工程师等)

前几天做了美团&#xff0c;OPPO的秋招笔试题&#xff0c;然后又做了一场小红书&#xff0c;总体难度我觉得都差不多&#xff0c;涉及到的知识点要么是语法模拟&#xff0c;或者就是一些基础算法&#xff0c;所以这样看秋招编程题还是很简单的&#xff0c;对于笔试我们还要把除…

深刻理解Redis集群(下):Redis 哨兵(Sentinel)模式

背景 现在对3个节点的sentinel进行配置。sentinel的配置文件在redis的安装目录中已经存在&#xff0c;只需要复制到指定的位置即可。 sentinel是独立进程&#xff0c;有对应的脚本来执行。 基于之前的redis 一主二从的架构&#xff0c;我们继续启动3个sentinel进程。 哨兵模式的…

使用微服务Spring Cloud集成Kafka实现异步通信

在微服务架构中&#xff0c;使用Spring Cloud集成Apache Kafka来实现异步通信是一种常见且高效的做法。Kafka作为一个分布式流处理平台&#xff0c;能够处理高吞吐量的数据&#xff0c;非常适合用于微服务之间的消息传递。 微服务之间的通信方式包括同步通信和异步通信。 1&a…

GPU参数指标

以英伟达的A800卡为例&#xff0c;简单聊聊GPU卡的核心参数指标&#xff0c;A800的核心指标主要有5个&#xff0c;为算力、显存大小、显存带宽、功耗情况和卡间互联速率。 性能&#xff1a;则可以理解为货车对不同货物类型的马力大小&#xff0c;决定能“拉动”多少重量的货&…

实用工具推荐---- PDF 转换

直接上链接&#xff1a;爱PDF |面向 PDF 爱好者的在线 PDF 工具 (ilovepdf.com) 主要功能如下&#xff1a; 全免费&#xff01;&#xff01;&#xff01;&#xff01;

什么是 Apache Ingress

Apache Ingress 主要用于管理来自外部的 HTTP 和 HTTPS 流量&#xff0c;并将其路由到合适的 Kubernetes 服务。 容器化与 Kubernetes 是现代云原生应用程序的基础。Kubernetes 的主要职责是管理容器集群&#xff0c;确保它们的高可用性和可扩展性&#xff0c;同时还提供自动化…

httpsok-v1.17.0-SSL通配符证书自动续签

&#x1f525;httpsok-v1.17.0-SSL通配符证书自动续签 介绍 httpsok 是一个便捷的 HTTPS 证书自动续签工具&#xff0c;基于全新的设计理念&#xff0c;专为 Nginx 、OpenResty 服务器设计。已服务众多中小企业&#xff0c;稳定、安全、可靠。 一行命令&#xff0c;一分钟轻…

Java中使用接口实现回调函数的详解与示例

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storm…