Golang语言面向对象编程说明
  1. Golang也支持面向对象编程(OOP),但是和传统的面向对象有区别,并不是纯粹的面向对象语言,所以我们说Golang支持面向对象编程特性是比较准确的;
  2. Golang没有类(class),Go语言的结构体(struct)和其它编程语言的类(class)有同等的地位,可以理解Golang是基于struct来实现OOP特性的;
  3. Golang面向对象编程非常简洁,去掉了传统的OOP语言的继承、方法重载、构造函数和析构函数、隐藏的this指针等等;
  4. Golang仍然有面向对象编程的继承,封装和多态的特性,只是实现的方式和其他OOP语言不一样,比如继承:Golang没有extends关键字,继承是通过匿名字段来实现;
  5. Golang面向对象很优雅,OOP本身就是语言类型的一部分,通过接口关联,耦合性低,也非常灵活,也就是说在Golang中面向接口编程是非常重要的特性。
结构体和结构体变量(实例)的区别和联系

1)结构体是自定义的数据类型,代表一类事物;
2)结构体变量(实例)是具体的,代表一个具体变量。

结构体的声明
type 标识符 struct{field1 typefield2 type
}
举例:
type Student struct{Name stringAge intScore float32
}

字段/属性
1)从概念或叫法上看,结构体字段 = 属性 = field
2)字段是结构体的一个组成部分,一般是基本数据类型、数组,也可是引用类型,比如定义的结构体的Name string就是属性

创建结构体变量和访问结构体字段
1)方式1-直接声明
var person Person
2)方式2-{}
var person Person = Person{}
3)方式3-&
var person *Person = new (Person)
4)方式4-{}
var person *Person = &Person{}

结构体的注意事项和使用细节
  1. 结构体的所有字段在内存中是连续的


  2. 结构体是用户单独定义的类型,和其它类型进行转换时需要有完全相同的字段(名字、个数和类型)
type A struct{Num int
}
type B struct{Num int
}
func main(){var a Avar b Bb = B(a)
}
  1. 结构体进行type重新定义(相当于取别名),Golang认为是新的数据类型,但是相互间可以强转
  2. struct的每个字段上,可以写上一个tag,该tag可以通过反射机制获取,常见的使用场景就是序列化和反序列化:
方法:
type A struct{Num int
}
func (a A)test(){fmt.Println(a.Num)
}

说明:
1)func(a A)test() {}表示A结构体有一个方法,方法名为test
2)(a A)体现test方法是和A类型绑定的
3)test方法只能通过A类型的变量来调用,而不能直接调用,也不能使用其他类型变量来调用

方法的调用和传参机制原理

说明:方法的调用和传参机制和函数基本一样,不一样的地方是方法调用时,会将调用方法的变量,当做实参也传递给方法。
1)在通过一个变量去调用方法时,其调用机制和函数一样
2)不一样的地方是变量调用方法时,该变量本身也会作为一个参数传递到方法(如果变量是值类型,则进行值拷贝;如果变量是引用类型,则进行地质拷贝)

方法的声明与定义:
func (recevier type) methodName(参数列表) (返回值列表){
方法体
return 返回值
}

方法和函数的区别

1)调用方式不一样
函数的调用方式:函数名(实参列表)
方法的调用方式:变量.方法名(实参列表)
2)对于普通函数,接受者为值类型时,不能将指针类型的数据直接传递,反之亦然
3)对于方法(如struct的方法),接受者为值类型时,可以直接用指针类型的变量调用方法,反过来同样也可以。
总结:不管调用形式如何,真正决定是值拷贝还是地址拷贝,看这个方法是和哪个类型绑定的。如果是值类型,比如(p Person),则是值拷贝;如果是和指针类型(p *Person),则是地址拷贝。

工厂模式

说明:Golang的结构体没有构造函数,通常可以使用工厂模式来解决这个问题。
看一下需求:
一个结构体的声明是这样的:
package model
type Student struct{
Name string…
}
因为这里的Student的首字母S是大写的,如果我们想在其它包创建Student的实例(比如main包),引入model包后,就可以直接创建Student结构体的变量,但是如果首字母是小写的,比如是type student struct{…}就不行了,怎么办---->工厂模式来解决

面向对象编程三大特性

Golang仍然有面向对象编程的继承,封装和多态的特性,只是实现的方式和其他OOP语言不一样。

面向对象编程思想——抽象
  • 如何理解抽象
    我们在定义一个结构体的时候,实际上就是把一类事物的共有的属性(字段)和行为提取出来,形成一个物理模型(模板),这种研究问题的方法称为抽象。
面向对象编程思想——封装

封装就是把抽象出的字段和对字段的操作封装在一起,数据被保护在内部,程序的其他包只有通过被授权的操作(方法),才能对字段进行操作。
封装的理解和好处:
1)隐藏实现细节
2)可以对数据进行验证,保证安全合理

如何实现封装:
1)对结构体中的属性进行封装
2)通过方法,包 实现封装

封装的实现步骤:
1)将结构体、字段的首字母小写(不能导出了,其他包不能使用,类似private)
2)给结构体所在包提供一个工厂模式的函数,首字母大写,类似一个构造函数
3)提供一个首字母大写的Set方法(类似其它语言的public),用于对属性判断并赋值
4)提供一个首字母大写的Get方法(类似其他语言的public),用于获取属性的值

说明:Golang开发中并没有特别强调封装,这点和java不同。

面向对象编程思想——继承

继承可以解决代码复用,让我们的编程更加靠近人类思维。当多个结构体存在相同的属性(字段)和方法时,可以从这些结构体中抽象出结构体,在该结构体中定义这些相同的属性和方法。
也就是说,在golang中,如果一个struct嵌套了另一个匿名结构体,那么这个结构体可以直接访问匿名结构体的字段和方法,从而实现了继承特性。

继承给编程带来的便利:
1)代码的复用性提高了
2)代码的扩展性和维护性提高了

继承的深入讨论:
如果一个struct嵌套了一个有名结构体,这种模式就是组合,如果是组合关系,那么在访问组合的结构体的字段或方法时,必须带上结构体的名字。

type D struct{a A
}
面向对象编程——多重继承

如一个struct嵌套了多个匿名结构体,那么该结构体可以直接访问嵌套的匿名结构体的字段和方法,从而实现了多重继承。

type Goods struct{Name stringPrice float64
}
type Grand struct{Name stringAddress string
}
type TV struct{GoodsGrand
}

多重继承细节说明:
1)如嵌入的匿名结构体有相同的字段名或者方法名,则在访问时,需要通过匿名结构体类型名来区分。
2)为了保证代码的简洁性,建议尽量不使用多重继承。

接口

基本介绍:
interface类型可以定义一组方法,但是这些方法不需要实现,并且interface不能包含任何变量,到某个自定义类型要使用的时候,在根据具体情况把这些方法写出来。
基本语法:

type 接口名 interface{method1(参数列表) 返回值列表method2(参数列表) 返回值列表...
}

说明:
1)接口里的所有方法都没有方法体,即接口的方法都是没有实现的方法,接口体现了程序设计的多态和高内聚低耦合的思想;
2)Golang中的接口,不需要显式的实现,只要一个变量,含有接口类型中的所有方法,那么这个变量就实现这个接口,因此,Golang中没有implement这样的关键字。

注意事项和细节:

  1. 接口本身不能创建实例,但是可以指向一个实现了该接口的自定义类型的变量
  2. 接口中所有的方法都没有方法体,即都是没有实现的方法
  3. 在Golang语言中,一个自定义类型需要将某个接口的所有方法都实现,我们说这个自定义类型实现了该接口
  4. 一个自定义类型只有实现了某个接口,才能将该自定义类型的实例赋给接口类型
  5. 只要是自定义数据类型,就可以实现接口,不仅仅是结构体类型。
  6. 一个自定义类型可以实现多个接口
  7. Golang接口中不能有任何变量
  8. 一个接口可以继承多个别的接口,这时如果要实现A接口,也必须将B,C接口的方法也全部实现
  9. interface类型默认是一个指针(引用类型),如果没有对interface初始化就使用,那么会输出nil
  10. 空接口interface{}没有任何方法,所以所有类型都实现了空接口

实现接口vs继承

  • 接口和继承解决的问题不同
    继承的价值主要在于:解决代码的复用性和可维护性
    接口的价值主要在于:设计,设计好各种规范(方法),让其它自定义类型去实现这些方法

  • 接口比继承更加灵活
    接口比继承更加灵活,继承是满足is-a的关系,而接口只需满足like-a的关系

  • 接口在一定程度上实现代码解耦

面向对象编程——多态

基本介绍:
变量(实例)具有多种形态,面向对象的第三大特征,在Go语言,多态特征是通过接口实现的,可以按照统一的接口来调用不同的实现,这时接口变量就呈现不同的形态。变量会根据传入的实参,来判断到底是哪个,从而执行对应的方法。

接口体现多态特征
1)多态参数
在Usb接口案例中,Usb usb,既可以接收手机变量,又可以接收相机变量,就体现了Usb接口多态
2)多态数组
演示一个案例:在Usb数组中,存放Phone结构体和Camera结构体变量,Phone还有一个特有的方法call(),请遍历Usb数组,如果是Phone变量,除了调用Usb接口声明的方法外,还需要调用Phone特有方法call.——类型断言

类型断言

b=a.(Point)就是类型断言,表示判断a是否指向Point类型的变量,如果是就转成Point类型并赋给b变量,否则报错。

类型断言,由于接口是一般类型,不知道具体类型,如果要转成具体类型,就需要使用类型断言。

Go语言编程之面向“对象”编程篇相关推荐

  1. 函数式编程和面向对象式编程_比较函数式编程,命令式编程和面向对象的编程

    函数式编程和面向对象式编程 As Oracle Corporation has introduced some Functional constructs in Java SE 8, now-a-da ...

  2. 为什么有人说面向对象编程就是面向接口编程?

    "面向对象编程就是面向接口编程" 这句话相信, 很多人都在网上见过, 装b利器. 我一开始也是这么想的, 那些装b者丢下这一句, 就没下文了. 首先, 我认为这句话是1个假命题. ...

  3. Java 设计模式 Day3 之面向抽象原则:什么是面向抽象编程?面向抽象编程如何应用?

    文章目录 前言 一.什么是面向抽象编程? 二.传统场景的类设计 2.1.项目场景设计 2.2.传统类设计存在的问题 三.采用面向抽象编程的类设计 3.1.设计一个抽象类/接口 3.2.采用上转型对象/ ...

  4. 面向“接口”编程和面向“实现”编程

    英文原文:Program to an Interface, Fool 如果你已经读了我的前几篇关于面向对象范式因为受到 Rust, Go 等语言的影响而发生变化的文章,看到了我正在研究的 Rust 设 ...

  5. java 接口编程_JAVA面向接口编程

    一.什么是面向接口编程 要正确地使用Java语言进行面向对象的编程,从而提高程序的复用性,增加程序的可维护性.可扩展性,就必须是面向接口的编程.面向接口的编程就意味着:开发系统时,主体构架使用接口,接 ...

  6. 从面向对象编程转为面向接口编程

    大家写过C++或者Java,或者其他语言,基本上都会接触到面向对象这个概念. 面向对象,本身是软件编程发展过程中的产物,当然相比于面向过程,是一种突破性的设计.但是,如果只是停留在面向对象编程,而不是 ...

  7. 函数式编程、面向对象编程、面向过程编程

    函数式编程: 它属于"结构化编程"的一种,主要思想是把运算过程尽量写成一系列嵌套的函数调用.举例来说,现在有这样一个数学表达式. 1. 代码简洁,开发快速 函数式编程大量使用函数, ...

  8. Java面向事件编程_Java面向事件编程

    基于Java的基础课程给教师和学生都提出了新的挑战.虽然Java要比C++简单,但Java作为一种具有大量标准库的面向对象语言这一事实既带来了新的复杂性,同时也带来了新的机会.. 本书作为计算机科学基 ...

  9. 面向技术编程,面向工资编程,面向用户编程?

    面向工资编程 上半年,石家庄房价疯涨的时候:公司里面的一个小伙找我,表达了自己想要离开的打算.我问他为什么?他说想离开石家庄去北京工作两年,积累一些财富,再回石家庄买房子付个首付.我看了看他的工资,也 ...

  10. Java 面向抽象编程和面向接口编程

    以下内容来自<Java 2实用教程>,主编:耿祥义.张跃平 鉴于面向抽象编程和面向接口编程思维培养的重要性,写此博客巩固. 面向抽象编程: 在设计程序时,经常会使用到abstract类,其 ...

最新文章

  1. 150m虚拟主机容量不足
  2. OC-Foundation框架
  3. 员外带你读论文:From RankNet to LambdaRank to LambdaMART: An Overview
  4. 会议交流 - CCKS2020 | 2020年全国知识图谱与语义计算大会
  5. SHA-1退休:数千万用户通向加密网站之路被阻
  6. 图像处理中的卷积与模板
  7. 快速开发框架介绍-懂你的RUOYI
  8. Codeforces Round #202 (Div. 1): D. Turtles(Lindström–Gessel–Viennot lemma定理+DP)
  9. 设计模式:java及spring观察者模式(有利于代码解耦)
  10. 给iOS开发新手送点福利,简述UIPageControl的属性和用法
  11. 关于C和C++中的基本数据类型int、long、long long、float、double、char、string的大小及表示范围
  12. PMP培训机构哪家好,求推荐?
  13. php+检测是否是手机浏览器,通过PHP、JavaScript、判断是否为手机浏览器
  14. Python标准库(各种模块介绍)
  15. 测试一下Pinia,Vuex 要出局了?
  16. 《CSS实战案例汇总》涟漪
  17. World Streamer学习2
  18. iOS crash报告问题
  19. 系动词可接哪些词语作表语
  20. pycharm远程连接并自动同步代码详细教程

热门文章

  1. Power BI能否做帕累托分析
  2. 第五周-第08章节-Python3.5-内置模块详解之shutil模块
  3. 51nod1160 压缩算法的矩阵——一道有趣的题
  4. Java抽象类与接口的区别:
  5. 20145204《网络对抗》免杀原理与实践
  6. OOP之C#设计及其UML(反向工程)
  7. 【转载】来自架构师的建议
  8. FPGA BCD计数器(一位)
  9. python滚动条翻页爬取数据_scrapy实践之翻页爬取的实现
  10. MaskFlownet图