golang | Go语言入门教程——结构体初始化与继承
本文始发于个人公众号:TechFlow,原创不易,求个关注
今天是golang专题第10篇文章,我们继续来看golang当中的面向对象部分。
在上一篇文章当中我们一起学习了怎么创建一个结构体,以及怎么给结构体定义函数,还有函数接收者的使用。今天我们来学习一下结构体本身的一些使用方法。
初始化
在golang当中结构体初始化的方法有四种。
new关键字
我们可以通过new关键字来创建一个结构体的实例,这种方法和其他语言比较类似,这样会得到一个空结构体指针,当中所有的字段全部填充它类型对应的零值。比如int就对应0,float对应0.0,如果是其他结构体则对应nil。
type Point struct {
x int
y int
}
func main() {
var p *Point = new(Point)
fmt.Print(p)
}
从这段代码当中我们可以看到,new函数返回的是一个结构体指针,而不是结构体的值。一般我们很少用new关键字,而是直接通过结构体加花括号的方式来初始化。
结构体名称
相比于使用new关键字,我们更常用的是通过结构体名称加上花括号的方式来进行初始化。
如果我们不再花括号当中填写参数的话,那么同样会得到一个填充了零值的结构体。结构体当中的所有属性都会被赋予这个类型对应的零值。
type Point struct {
x int
y int
}
func main() {
p := Point{}
fmt.Print(p)
}
如果我们想要初始化一个结构体的指针,我们只需要在结构体名称之前加上取地址符&即可。所以创建一个结构体指针可以这样:
func main() {
p := &Point{}
fmt.Print(p)
}
golang当中取地址符和声明指针的关键字和C语言是一样的,对于熟悉C语言的同学来说,这应该并不困难。
我们在花括号当中填充参数,这些参数会按照顺序填充到结构体的属性当中。为了防止混淆,我们也可以在值之前加上它对应的属性名称。
func main() {
p := &Point{0, 0}
k := &Point{x: 0, y: 10}
fmt.Print(p)
}
继承
很多人不喜欢golang的主要原因就是觉得golang阉割了面向对象的很多功能之后,导致开发的时候束手束脚,总觉得不太方便。其中为人诟病得比较厉害的就是继承,觉得golang当中没有继承,写有依赖的结构体的时候非常蛋疼。
我之前一度也这么觉得,最近仔细研究了其中的道道之后,发现我错了,golang当中也是有继承的,不过它实现的方式和我们一般理解上的不太一样,有一些出其不意。所以我们拿正统的眼光去看它总会觉得它不伦不类,哪里不太对劲。这种感觉有点像是武侠小说里名门正派看旁门左派的感觉,但旁门左派并不代表就不行,也有能打的。
在我们正常的映像当中,我们实现继承就应该是标明当前这个类的父类是哪个类,这样底层编译器自动将父类的属性和方法都拷贝一份到子类当中来。加上private、public等关键词束缚,来控制一下什么方法和属性可以被继承什么不可以就完美了。
我们用Python举个例子,Python当中对于继承的定义已经非常简洁了,实现起来大概是这样的:
class A:
pass
class B(A):
pass
直接在类名的后面就加上继承的信息,实际上绝大多数主流语言也都是这么干的。但golang不是,它做了一件什么事呢?它将父类作为变量定义在了子类的里面,严格说起来这已经不是继承了,算是一种奇怪的组合,但它起到的功能类似于继承。
我光说理解起来很累,我们来看个例子,比如我们当下有一个父类(结构体),它有两个结构体方法:
type Father struct {
Name string
}
func(entity Father) Hello() {...}
func(entity Father) World() {...}
现在我们要创建一个它的子类,需要把Father这个结构体填进去,变成其中一个成员变量。
type Child struct {
Father
...
}
那有了这么一个看起来很奇怪的子类之后,我们怎么调用父类的方法呢?
答案是直接调用。
child := Child{}
child.Hello()
按照我们的理解,由于父类是子类当中的一个成员,所以我们想要调用父类的方法,应该写成child.Father.Hello()才对。但实际上golang替我们做了相关的优化,我们直接调用方法,也可以找到父类当中的方法。
如果我们要改写父类的方法也不困难,我们可以这样操作:
func (entity Child) World() {
entity.Father.World()
...
}
如此,父类当中的World方法就被Child改写了,这样就完成了继承当中对父类函数的改写。
总结
到这里,关于golang当中结构体初始化与继承的介绍就结束了。不知道大家看完这篇有什么样的感受,我最大的感觉是好像没有第一次看到它的时候那么难以接受了XD。
据说这个设计和C++当中的虚基类的概念非常接近,但是虚基类非常难以理解(比如我就没能理解),以至于许多C++工程师会自动忽略它的存在。相比之下,golang的这种设计要容易理解得多。虽然看起来麻烦,但是理解起来也并不困难。
今天的文章到这里就结束了,如果喜欢本文的话,请来一波素质三连,给我一点支持吧(关注、转发、点赞)。
本文使用 mdnice 排版
golang | Go语言入门教程——结构体初始化与继承的更多相关文章
- C语言语法教程-结构体
2018-09-30 结构体中成员变量地址是连续的,结构体用于描述记录. Create a struct //---------------------------- //struct1.c //创建 ...
- C语言结构体初始化方法
早上苏凯童鞋问我这个问题来着,写在这里. 我了解到的C中结构体初始化的方法大概有三种. 如这里我定义了一个结构体: typedef struct node { int x, y; }Node; 第一种 ...
- Go语言基础之结构体(面向对象编程上)
1 自定义类型和类型别名 1.1 自定义类型 Go语言中可以基于一些基本的数据类型,使用type关键字定义自定义类型的数据 . 自定义类型定义了一个全新的类型,该新类型具有基本数据类型的特性.自定义类 ...
- Golang面向对象编程-struct(结构体)
Golang面向对象编程-struct(结构体) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是面向对象编程 面向对象编程(Object Oriented Program ...
- 《JavaScript语言入门教程》记录整理:入门和数据类型
目录 入门篇 js介绍 历史 基本语法 数据类型 概述 null 和 undefined 数值 字符串 对象 函数 数组 本系列基于阮一峰老师的<JavaScrip语言入门教程>或< ...
- Linux C中结构体初始化
在阅读GNU/Linux内核代码时,我们会遇到一种特殊的结构初始化方式.该方式是某些C教材(如谭二版.K&R二版)中没有介绍过的.这种方式称为指定初始化(designated in ...
- Swift入门篇-结构体
前面主要是介绍swift语言中基本类型的用法,今天给大家介绍的是swift的结构体的用法,swift中结构体的用法和其他语言的用法,还有不太一样,不过您多敲几遍,就可以理解结构体,结构体在ios开发中 ...
- C语言中的结构体,结构体数组
C语言中的结构体是一个小难点,下面我们详细来讲一下:至于什么是结构体,结构体为什么会产生,我就不说了,原因很简单,但是要注意到是结构体也是连续存储的,但要注意的是结构体里面类型各异,所以必然会产生内存 ...
- Go语言基础之结构体
Go语言基础之结构体 Go语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念.Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性. 类型别名和自定义类型 自定义类型 在G ...
随机推荐
- CVE-2020-0796—远程代码执行漏洞
一.漏洞名称: 微软SMBv3 Client/Server - 远程代码执行漏洞——CVE-2020-0796 二.识别点: 445端口 三.影响范围: Windows 10 Version 1903 ...
- Spring事务方法上增加synchronized真的有效果吗?
此文转载,Spring事务本身是一个非常复制的问题,再加上线程并发处理就更加要主要了,由于再开发中有很多朋友会范与下文同样的错误,因分享给大家. 前言 Spring事务的一个奇怪的问题. 朋友问了我一 ...
- 一分钟开始持续集成之旅系列之:C 语言 + Makefile
作者:CODING - 朱增辉 前言 make 工具非常强大,配合 makefile 文件可以实现软件的自动化构建,但是执行 make 命令依然需要经历手动输入执行.等待编译完成.将目标文件转移到合适 ...
- JavaWeb网上图书商城完整项目--day02-8.提交注册表单功能之dao、service实现
1.发送邮件 发送邮件的时候的参数我们都写在了配置文件中,配置文件放在src目录下,可以使用类加载器进行加载该数据 //向注册的用户发送邮件 //1读取配置文件 Properties properti ...
- ubuntu上面安装mysql
一.安装mysql 1. 安装需要使用root账号,如果不会设置root账号的请自行google.安装mysql过程中,需要设置mysql的root账号的密码,不要忽略了. sudo apt-get ...
- android面试详解
前台就是和用户交互的进程 可见进程例如一个activity被一个透明的对话框覆盖,该activity就是可见进程 服务:service进程 后台一个activity按了home按键就是从前台退回到后台 ...
- 深度学习“四大名著”发布!Python、TensorFlow、机器学习、深度学习四件套!
Python 程序员深度学习的"四大名著": 这四本书着实很不错!我们都知道现在机器学习.深度学习的资料太多了,面对海量资源,往往陷入到"无从下手"的困惑出境. ...
- yqq命令
用 apt-get install 安装时 ,会有一个提问,问是否继续,需要输入 yes.使用 yqq 的话,就没有这个提问了,自动 yes . 例如下面的更新和安装nginx: apt-get -y ...
- 洛谷 P1991 【无线通讯网】
这道题找到关键点那就是模板题了,代码好写哒~ 因为有S个电话,两个电话就可以连通两个块,那是不是我们就可以看做一条无消耗的边,提前连了起来.根据Kruskal的思想,我们每次加入最小的边,直到联通,由 ...
- HTTPS连接建立过程(单向&双向)
HTTPS连接建立过程(单向&双向) 什么是https SSL(Secure Sockets Layer 安全套接字协议),及其继任者传输层安全(Transport Layer Securit ...