Golang的面向对象编程【结构体、方法、继承、接口】
Golang也支持面向对象编程。但与以前学过传统的面向对象编程语言有区别。
1)Golang没有类class,Go语言的结构体struct和类class有相似的特性。
2)Golang中不存在继承,方法重载,构造函数,析构函数,隐藏和this指针。
3)Golang有继承,封装,多态的特性,但是实现方法与传统OOP语言不同。
1. 结构体struct
type 标识符 struct{
…field type
}
…
type Student struct {
…Name string // 字段 属性
…Age int
…Score float32
}
…
结构体的字段类型可以是:基本类型、数组、引用类型。在创建一个结构体变量时,如果没有进行字段赋值,则对应一个默认值。
其中,指针、slice、map的默认值是nil,没有分配空间,所以如果要使用,需要先进行make。
1.1 结构体实例内存布局
注意:结构体类型属于值类型。
1.2 结构体实例化
…
type Student struct {
…Name string // 字段 属性
…Age int
…Score float32
}
…
1)直接声明
var s1 Student
2)结构体{}
var s2 Student = Student{ “tom” ,12, 98}
// s2 = Student{ “tom” ,12, 98}
3)new函数
var s3 *Student = new(Student)
4)引用地址
var s4 *Student = &Student{ }
// var s4 *Student = &Student{“marry”, 27 ,88}
1.3 结构体使用注意事项
1)结构体中的所有字段在内存中连续的。
2)结构体是用户自定义类型,若要进行类型转换,需要具有相同的字段,包括名字,个数和类型。
3)结构体进行type重新定义,相当于取别名。两个类型是不相同的数据类型,不能直接赋值,可以通过强制类型转换。
4)在结构体每个字段是可以写tag。该 可以通过反射机制获取,常见的使用场景就是序列化与反序列化。
在处理json格式字符串的时候,经常会看到声明struct结构的时候,属性的右侧还有小米点括起来的内容。形如
type User struct {
UserId int json:"user_id" bson:"user_id"
UserName string json:"user_name" bson:"user_name"
}
2. 方法
相当于其他OOP语言的类的类函数,在Golang中,方法是作用于指定的数据类型上。自定义类型和基本类型都可以有方法。
func (recevier type) mathodName (参数列表) (返回值列表){
…方法体
…return 返回值
}
type A struct{
…Num int
}
//定义了一个结构体A的方法
func (a A)test(){
…fmt.Println(a.Num)
}
方法的注意事项和细节
1)结构体类型是值类型,在方法调用中,也遵守值拷贝传递参数。
2)如果需要修改结构体变量,可以通过结构体指针的方式来进行参数传递。
3)Golang中方法的作用不仅是结构体的自定义类型,基本数据类型也可以有自己的方法。
4)方法的访问也有类似于字段的权限,即方法名首字母小写,就只能在本包中访问,首字母大写,就可以导出在其他包中调用。
5)如果一个类型实现了String()犯法,那么对于fmt.Println()函数默认会调用这个变量的String()进行输出。
3. Golang的三大特性:封装、继承、多态
3.1 封装
封装就是把抽象的字段和对字段的操作封装在一起,数据被保护在内部,程序的其他包只有通过被授权的操作方法,才能对字段进行操作。
在Golang中封装的实现比较简单
1)将结构体、字段的首字母小写。
2)给结构体提供一个工厂模式的函数(类似于构造函数),首字母大写,可被访问。
3)提供一个Set() 函数方法,对字段进行修改。
4)提供一个Get() 函数方法,用于获取字段。
3.2 继承
type Goods struct{
…Name string
…Price int
}
type Book struct{
…Goods //继承–嵌套匿名结构体
…Writer string
}
注意:
1)结构体可以使用嵌套匿名结构体的所有字段和方法。
2)当结构体与匿名结构体有相同字段或者方法时,编译器会采用就近访问原则。
3)当结构体中有多个匿名结构体,且匿名结构体具有相同的字段和方法时,必须指定匿名结构体名字,否则编译会报错。
4)如果结构体中嵌套有名的结构体变量,这种模式是组合。访问字段和方法时,必须使用嵌套结构体名。
type Book struct{
…g Goods //组合–嵌套有名结构体
…Writer string
}
5)嵌套结构体之后,在创建变量时,可以直接指定匿名结构体字段的值。
b Book{
…Goods{ “1Q84” , 103},
…Wtiter : 东野圭吾,
}
多继承
一个结构体嵌套了多个匿名结构体,那么该结构体可以直接访问嵌套的匿名结构体的字段 和方法,从而实现了多重继承。
3.3 多态
多态是通过接口来实现的。
3.3.1 接口
简单的接口模拟:
Phone,Camera实现了Usb接口的方法,所以phone,Camera就实现了接口的方法。
基本语法
interface类型定义一组方法啊,但不需要实现,而且interface中不能包含任何变量。
type 接口名 intrface {
…方法名1(参数列表)(返回值列表)
…方法名2(参数列表)(返回值列表)
}
接口中的所有方法都没有方法体。
接口的实现
自定义类型实现接口,需要实现接口中声明的所有方法。
注意事项与细节
1)接口不能实例化(类似于C++中的抽象类),可以指向一个实现了该接口的自定义类型的变量。
2)只要是自定义数据类型,就可以实现接口,不仅仅是结构体类型。
3)一个自定义类型可以实现多个接口。
4)接口之间可以实现继承,利用嵌套匿名接口。此时,自定义类型要实现该接口,必须实现该接口所继承的的接口的方法和自己的方法。即A接口继承B,C接口,则自定义类型需要实现A,B,C三个接口的所有方法。
5)interface类型默认是一个指针(引用类型),如果没有对interface初始化,则其为nil。
6)空接口type T interface{}没有任何方法,所有的类型都实现了该空接口,也就可以将任何变量赋给空接口。
接口与继承间的区别:
1)继承的价值在于解决代码的复用性和可维护性;接口的价值在于设计出各规范,让自定义类型去实现。
2)接口比继承更加灵活,接口是like-a的关系,继承是is-a的关系。
3)接口在一定程度上实现代码的解耦。
3.3.2 多态
接口可以体现多态的特征。
1)多态参数
2)多态数组
4. 类型断言
由于接口是一般类型,不知道具体的数据类型,如果需要转成具体类型,就需要使用类型断言,如下:
1)在进行类型断言时,如果类型不匹配,就会崩溃panic,所以在使用的时候确保原来的空接口就是要转的数据类型。
2)进行断言时带检查机制,如果成功就ok,如果失败不要崩溃报panic。
————————————————
版权声明:本文为CSDN博主「周杰伦是李小莹的男神」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_29191321/article/details/83826207
Golang的面向对象编程【结构体、方法、继承、接口】的更多相关文章
- golang之面向对象编程
1.Golang语言面向对象编程说明 1)Golang也支持面向对象编程(OOP),但是和传统的面向对象编程有区别,并不是纯粹的面向对象语言.所以我们说Golang支持面向对象编程特性是比较准确的. ...
- Go 面向对象之结构体
#### Go 面向对象之结构体最近有四天没更新公众号,有一些事情耽误了,生活就是这样,总会一些事情让人措不及防; ***山浓水浅,坐看流年***1. Go 也支持面向对象编程(OOP) 但是它和传统 ...
- go结构体方法
Golang中的方法是作用在特定类型的变量上,因此自定义类型,都可以有方法,而不仅仅是struct. 定义格式 func (var *Struct_Name) FuncName( var0, var1 ...
- Go语言 - 结构体 | 方法
自定义类型和类型别名 自定义类型 在Go语言中有一些基本的数据类型,如string.整型.浮点型.布尔等数据类型, Go语言中可以使用type关键字来定义自定义类型. 自定义类型是定义了一个全新的类型 ...
- Python - 面向对象编程 - 三大特性之继承
继承 继承也是面向对象编程三大特性之一 继承是类与类的一种关系 定义一个新的 class 时,可以从某个现有的 class 继承 新的 class 类就叫子类(Subclass) 被继承的类一般称为父 ...
- (二)Javascript面向对象编程:构造函数的继承
Javascript面向对象编程:构造函数的继承 这个系列的第一部分,主要介绍了如何"封装"数据和方法,以及如何从原型对象生成实例. 今天要介绍的是,对象之间的"继承 ...
- 洗礼灵魂,修炼python(34)--面向对象编程(4)—继承
前面已经说到面向对象编程有封装,继承,多态三大特性,那么其中的继承则很重要,可以直接单独的拿出来解析 继承 1.什么是继承: 字面意是子女继承父母的家产或者特性等.而在编程里继承是指子类继承父类(基类 ...
- C++ Primer 学习笔记_72_面向对象编程 --句柄类与继承[续]
面向对象编程 --句柄类与继承[续] 三.句柄的使用 使用Sales_item对象能够更easy地编写书店应用程序.代码将不必管理Item_base对象的指针,但仍然能够获得通过Sales_item对 ...
- 换个语言学一下 Golang (9)——结构体和接口
基本上到这里的时候,就是上了一个台阶了.Go的精华特点即将展开. 结构体定义 上面我们说过Go的指针和C的不同,结构体也是一样的.Go是一门删繁就简的语言,一切令人困惑的特性都必须去掉. 简单来讲,G ...
- Go 结构体方法
#### Go 结构体方法本来今天有些事情忙的不准备更新内容了,后来提前完成了, 所以还是要更新了; 毕竟坚持本就是一件不容易的事情!加油,相信不管是大家还是我,都有一些事情想要做,那就坚持吧,剩下的 ...
随机推荐
- MonkeyRunner的简介与综合实践
官方介绍: Monkeyrunner工具提供了一个API,用于编写可从Android代码外部控制Android设备或模拟器的程序.使用monkeyrunner,您可以编写一个Python程序来安装An ...
- django RBAC类
# -*- coding: utf-8 -*- ''' @author: Swain @contact: 624420781@qq.com @file: middlewares.py @time: 2 ...
- k8sReplicaSet控制器
一.ReplicaSet概述 简称RS,是pod控制器类型的一种实现,用于确保由其管控的pod对象副本数在任一时刻都能精确满足期望的数量.ReplicaSet控制器资源启动后会查找集群中匹配其标签选择 ...
- Acwing-271-杨老师的照相排列(DP)
链接: https://www.acwing.com/problem/content/273/ 题意: 杨老师希望给他的班级拍一张合照. 学生们将站成左端对齐的多排,靠后的排站的人数不能少于靠前的排. ...
- Python 正则表达式Ⅳ
repl 参数是一个函数 以下实例中将字符串中的匹配的数字乘以 2: 执行输出结果为: re.compile 函数 compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象 ...
- Oracle体系结构2
Buffer Cache 作用:缓存dbf中的数据 例子:A和B重复访问同一张表的几率是很大的,如果每次访问dbf时都要发生物理IO,这样会导致数据库的性能非常低 由于这个例子,当一个进程访问dbf时 ...
- JavaScript 内置函数有什么?
javaScript内置函数 1.Date:日期函数 属性:constructor 所修立对象的函数参考prototype 能够为对象加进的属性和方法 方法:getDay() 返回一周中的第几天(0- ...
- 在HTML中引入CSS的方式
有 4 种方式可以在 HTML 中引入 CSS.其中有 2 种方式是在 HTML 文件中直接添加 CSS 代码,另外两种是引入 外部 CSS 文件. ㈠内联方式 内联方式指的是直接在 HTML 标 ...
- CF1205C Palindromic Paths
题目链接 问题分析 首先可以想到,坐标和为奇数的位置可以被唯一确定.同样的,如果假定\((1,2)\)是\(0\),那么坐标和为偶数的位置也可以被唯一确定.这样总共使用了\(n^2-3\)次询问. 那 ...
- Spring Boot教程(三十)使用Spring-data-jpa(1)
在实际开发过程中,对数据库的操作无非就“增删改查”.就最为普遍的单表操作而言,除了表和字段不同外,语句都是类似的,开发人员需要写大量类似而枯燥的语句来完成业务逻辑. 为了解决这些大量枯燥的数据操作语句 ...