【Go】十四、封装、继承

文章目录

  • 1、封装
  • 2、继承
  • 3、继承的注意点

1、封装

  • 隐藏实现细节
  • 保证数据安全(控制变量或方法的访问范围,private)

Go中实现封装:

  • 结构体、字段的首字母小写(Java的private)
  • 提供一个工厂模式函数,首字母大写(public)
//提供一个首字母大写的Set方法(类似其它语言的public),用于对属性判断并赋值
func (var 结构体类型名)SetXxx(参数列表){//加入数据验证的业务逻辑var.Age =参数
}
//提供一个首字母大写的Get方法(类似其它语言的public),用于获取属性的值
func (var 结构体类型名) GetXxx() (返回值列表){return var.字段; 
}

示例:

在这里插入图片描述

其他包中创建示例,并对字段赋值:

在这里插入图片描述

2、继承

和Java的extends相比,Go中对结构体的继承,通过匿名结构体实现:如果一个struct嵌套了另一个匿名结构体,那么这个结构体可以直接访问匿名结构体的字段和方法,从而实现了继承特性。

在这里插入图片描述

代码实现:

package main
import ("fmt"
)
//定义动物结构体:
type Animal struct{Age intWeight float32
}
//给Animal绑定方法:喊叫:
func (an *Animal) Shout(){fmt.Println("我可以大声喊叫")
}
给Animal绑定方法:自我展示:
func (an *Animal) ShowInfo(){fmt.Printf("动物的年龄是:%v,动物的体重是:%v",an.Age,an.Weight)
}
//定义结构体:Cat
type Cat struct{//为了复用性,体现继承思维,嵌入匿名结构体:——》将Animal中的字段和方法都达到复用Animal
}
//对Cat绑定特有的方法:
func (c *Cat) scratch(){fmt.Println("我是小猫,我可以挠人")
}
func main(){//创建Cat结构体示例:cat := &Cat{}cat.Animal.Age = 3cat.Animal.Weight = 10.6cat.Animal.Shout()cat.Animal.ShowInfo()cat.scratch()
}

3、继承的注意点

1)结构体可以使用嵌套匿名结构体所有的字段和方法,无关父结构体字段方法的大小写

package main
import ("fmt"
)
//定义动物结构体:
type Animal struct{Age intweight float32
}
//给Animal绑定方法:喊叫:
func (an *Animal) Shout(){fmt.Println("我可以大声喊叫")
}
给Animal绑定方法:自我展示:
func (an *Animal) showInfo(){fmt.Printf("动物的年龄是:%v,动物的体重是:%v",an.Age,an.weight)
}
//定义结构体:Cat
type Cat struct{Animal
}func (c *Cat) scratch(){fmt.Println("我是小猫,我可以挠人")
}
func main(){//创建Cat结构体示例:cat := &Cat{}cat.Animal.Age = 3cat.Animal.weight = 10.6cat.Animal.Shout()cat.Animal.showInfo()		//小写也可以访问!!!1cat.scratch()
}

2)匿名结构体字段访问可以简化。下面两种等价:cat.Age --->cat对应的结构体中找是否有Age字段,如果有直接使用,如果没有就去找嵌入的结构体类型中的Age

在这里插入图片描述
在这里插入图片描述

3)当结构体和匿名结构体有相同的字段或者方法时,编译器采用就近访问原则访问。想访问匿名结构体的方法或字段,可加上结构体名

cat := &Cat{}
cat.weight = 9.4
cat.Age = 10 //就近原则
cat.Animal.Age = 20			//打破就近
cat.showInfo()//就近原则
cat.Animal.showInfo()		//打破就近

4)和Java不同,Go支持多继承

package main
import ("fmt"
)
type A struct{a intb string
}
type B struct{c intd string
}
type C struct{AB
}
func main(){//构建C结构体实例:c := C{A{10,"aaa"},B{20,"ccc"}}fmt.Println(c)
}

5)多继承时,父结构体若出现相同的字段名或者方法名,访问时带结构体类型名

package main
import ("fmt"
)
type A struct{a intb string
}
type B struct{c intd stringa int
}
type C struct{AB
}
func main(){//构建C结构体实例:c := C{A{10,"aaa"},B{20,"ccc",50}}fmt.Println(c.b)fmt.Println(c.d)fmt.Println(c.A.a)			访问同名的字段fmt.Println(c.B.a)			访问同名的字段
}

6)结构体的匿名字段可以是基本数据类型

在这里插入图片描述

7)嵌套匿名结构体后,也可以在创建结构体变量(实例)时,直接指定各个匿名结构体字段的值

在这里插入图片描述

8)嵌入匿名结构体的指针也是可以的

在这里插入图片描述

9)构体的字段可以是结构体类型的,注意这是组合模式,无关继承

type B struct{c intd stringa int
}

在这里插入图片描述

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

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

相关文章

微服务管理(完整)

前言: 分享一篇学微服务管理的过程 一,etcd入门 1,简介 1.1,etcd是什么 etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(key-value)数据库。 官网上的一段描述: A…

Tomcat调优总结(Tomcat自身优化、Linux内核优化、JVM优化)

Tomcat自身的调优是针对conf/server.xml中的几个参数的调优设置。首先是对这几个参数的含义要有深刻而清楚的理解。以tomcat8.5为例,讲解参数。 同时也得认识到一点,tomcat调优也受制于linux内核。linux内核对tcp连接也有几个参数可以调优。 因此我们可…

java数据结构与算法刷题-----LeetCode695. 岛屿的最大面积

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 文章目录 1. 深度优先遍历2. 广度优先 1. 深度优先遍历 这不是找最短路径&…

蓝桥杯刷题第七天

这道题一开始看真的有点简单,但一开始跟着案例先入为主了,误以为是只有两个项目想着穷举完n个人,(n1)*(n2)/2种情况但后面发现项目不止两个,用链表来好像我也不会,用二维…

linux编辑器——vim使用方法

文章目录 linux编辑器——vim使用方法1. vim的基本概念2. vim的基本操作3. vim正常模式命令集4. vim末行模式命令集5. vim操作总结6.简单vim配置7.参考资料 linux编辑器——vim使用方法 vi/vim的区别简单点来说,它们都是多模式编辑器,不同的是vim是vi的…

泛域名站群,泛域名程序

泛域名站群是一种利用大量类似的泛域名来建立多个网站,并通过这些网站链接到主网站,以提升主网站的排名和流量的策略。泛域名站群通常包含大量的子域名,这些子域名指向不同的页面,但它们的内容大部分是重复或相似的,目…

【Frida】【Android】08_爬虫之网络通信库okhttp3

🛫 系列文章导航 【Frida】【Android】01_手把手教你环境搭建 https://blog.csdn.net/kinghzking/article/details/136986950【Frida】【Android】02_JAVA层HOOK https://blog.csdn.net/kinghzking/article/details/137008446【Frida】【Android】03_RPC https://bl…

编译和链接(基础速通版)

翻译环境和运行环境 前提解释 电脑是不能直接执行C语言的程序代码的,所依赖的是翻译环境进行一个源代码运行的时候需要经过翻译环境和运行环境的处理,才能得到你需要的可运行程序。 这里是源文件,也就是 .c文件,通过翻译环境得…

图解PyTorch中的torch.gather函数和 scatter 函数

前言 torch.gather在目前基于 transformer or query based 的目标检测中,在最后获取目标结果时,经常用到。 这里记录下用法,防止之后又忘了。 介绍 torch.gather 官方文档对torch.gather()的定义非常简洁 定义:从原tensor中获…

Ubuntu joystick 测试手柄 xbox

Ubuntu joystick 测试手柄 xbox 测试使用Ubuntu20.04 测试环境在工控机 安装测试 实际测试使用的手柄是北通阿修罗2pro 兼容xbox Ubuntu20.04主机 连接手柄或者无线接收器后查看是否已经检测到: ls /dev/input找到输入中的 js0 即为手柄输入 需要安装joysti…

注意力机制篇 | YOLOv8改进之添加DAT注意力机制

前言:Hello大家好,我是小哥谈。DAT(Vision Transformer with Deformable Attention)是一种引入了可变形注意力机制的视觉Transformer。在训练算法模型的时候,通过引入可变形注意力机制,改进了视觉Transformer的效率和性能,使其在处理复杂的视觉任务时更加高效和准确。�…

css酷炫边框

边框一 .leftClass {background: #000;/* -webkit-animation: twinkling 1s infinite ease-in-out; 1秒钟的开始结束都慢的无限次动画 */ } .leftClass::before {content: "";width: 104%;height: 102%;border-radius: 8px;background-image: linear-gradient(var(…

正则表达式引擎库汇合

1.总览表格 一些正则表达式库的对比 index库名编程语言说明代码示例编译指令1Posix正则C语言是C标准库中用于编译POSIX风格的正则表达式库 posix-re.cgcc posix-re.c 2PCRE库C语言提供类似Perl语言的一个正则表达式引擎库。 一般系统上对应/usr/lib64/libpcre.so这个库文件&am…

柔性数组详细讲解

动态内存函数的使用和综合实践-malloc,free,realloc,calloc-CSDN博客https://blog.csdn.net/Jason_from_China/article/details/137075045 柔性数组存在的意义 柔性数组在编程语言中指的是可以动态调整大小的数组。相比固定大小的数组&#…

STL容器的一些操作(常用的,不全)

目录 string 1.string的一些创建 2.string 的读入和输出: 3.string的一些操作 4.彻底清空string 容器的函数 vector 1.vector的一些创建: 2.vector的一些操作: 3.vector的彻底清空并释放内存: queue 循环队列&#xff1…

兑换码生成算法

兑换码生成算法 兑换码生成算法1.兑换码的需求2.算法分析2.重兑校验算法3.防刷校验算法 3.算法实现 兑换码生成算法 兑换码生成通常涉及在特定场景下为用户提供特定产品或服务的权益或礼品,典型的应用场景包括优惠券、礼品卡、会员权益等。 1.兑换码的需求 要求如…

Pointnet++分类和分割数据集准备和实验复现

5.分类数据集Modelnet40及可视化 Modelnet40分类数据集 原始的modelnet40是off文件,是cad模型 OFF文件是一种用于存储三维对象信息的文件格式,全称为"Object File Format"。它主要用于存储几何体的顶点、边和面信息,以及可能的颜…

面对复杂多变的网络攻击,企业应如何守护网络安全

企业上云,即越来越多的企业把业务和数据,迁移到云端。随着云计算、大数据、物联网、人工智能等技术的发展,用户、应用程序和数据无处不在,企业之间的业务边界逐渐被打破,网络攻击愈演愈烈,手段更为多。 当前…

uni app 扫雷

闲来无聊。做个扫雷玩玩吧&#xff0c;点击打开&#xff0c;长按标记&#xff0c;标记的点击两次或长按取消标记。所有打开结束 <template><view class"page_main"><view class"add_button" style"width: 100vw; margin-bottom: 20r…

Docker容器监控之CAdvisor+InfluxDB+Granfana

介绍&#xff1a;CAdvisor监控收集InfluxDB存储数据Granfana展示图表 目录 1、新建3件套组合的docker-compose.yml 2、查看三个服务容器是否启动 3、浏览cAdvisor收集服务&#xff0c;http://ip:8080/ 4、浏览influxdb存储服务&#xff0c;http://ip:8083/ 5、浏览grafan…