golang 面向对象
深入理解GO语言的面向对象_Golang_脚本之家 https://www.jb51.net/article/94030.htm
深入理解GO语言的面向对象
更新时间:2016年10月04日 10:44:02
前言
有过C++语言学习经历的朋友都知道,面向对象主要包括了三个基本特征:封装、继承和多态。封装,就是指运行的数据和函数绑定在一起,C++中主要是通过this指针来完成的;继承,就是指class之间可以相互继承属性和函数;多态,主要就是用统一的接口来处理通用的逻辑,每个class只需要按照接口实现自己的回调函数就可以了。
作为集大成者的Go语言,自然不会在面向对象上面无所作为。相比较C++、Java、C#等面向对象语言而言,它的面向对象更简单,也更容易理解。
go语言中并没有像C++,Java语言中这类的Class,它只含有像C语言中的结构体,用结构体和指针等特性,完成一个类的作用,很巧妙的使用了指针和结构体,不仅是go的面向对象,包括go语言中的map等操作都是借助了结构体。其实,说白了,C++、Java等面向对象的语言中,类的底层实现就是结构体,对象的引用就是指针,只是语言把他们封装起来了而已。然而这使得很多人刚接触面向对象的时候很不理解这些东西。
下面,说所面向对象在go中的写法:
如果我们要再Java中定义一个Rect,可以求其面积,我们应该这么写
|
1
2
3
4
5
6
7
|
public class Rect { public int x; public int y; public int Area() { return x*y; }} |
很简单,那么Go语言中怎么做呢?Go中并不存在所谓的类,所有的类都是用结构体表示的,所以要写一个类,我们先得定义一个结构体:
|
1
2
3
|
type Rect struct { x, y int} |
这是一个Rect的结构体,那么一个类中,不仅要存在变量,还要有成员函数,那么go的成员函数是这么写的:
|
1
2
3
|
func (r *Rect) Area() int { return r.x*r.y} |
这个成员函数的功能是求面积的,显然,这个成员函数值对Rect的结构体适用,这样就实现了所谓的封装,那么,我们如何去创建并初始化类的实例呢
go语言提供了很多方式:
|
1
2
3
4
|
rect :=new(Rect)rect :=&Rect{}rect :=&Rect{1,2}rect :=&Rect{x:3,y:4} |
那么,一遍情况下,如果没有指定成员变量的大小,go语言会默认初始化成员变量为0,bool类型的为false。
那么,构造函数呢?
我们可以这么来写:
|
1
2
3
|
func NewRect(x,y int) *Rect { return &Rect{x,y}} |
其实,这也是我们平时new一个对象时候的真正操作,只是go把他真正展现给我们了。
看到这里,我们似乎还有一个疑问,那就是,像java、C++中对于可见性的描述呢,go语言中不存在public等关键字,go语言中直接选择用字母大小写控制。
一个变量以大写字母开头则表示对其他包可见,如果想要不可见,那么使用小写字母即可,但是go语言中的可见性控制只是针对包的,并不针对类,也就是,同一个包下的类都是可见的。这个时候我们就可以知道了为什么输出语句是这样写的了吧:
|
1
|
fmt.Println("hello world") |
因为此函数对其他包是可见的。
golang 面向对象的更多相关文章
- golang面向对象和interface接口
一. golang面向对象介绍 1.golang也支持面向对象编程,但是和传统的面向对象编程有区别,并不是纯粹的面向对象语言.2.golang没有类(class),golang语言的结合体(struc ...
- Golang面向对象编程-struct(结构体)
Golang面向对象编程-struct(结构体) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是面向对象编程 面向对象编程(Object Oriented Program ...
- golang 面向对象编程
概述 Golang语言的面向对象与c++,py等语言有所不同,是由于Golang不支持继承:与上述支持聚合和继承的面向对象的语言不同,Golang只支持聚合(也叫做组合)和嵌入.聚合和嵌入的区别: t ...
- 【GoLang】golang 面向对象编程 & 面向接口编程
005.面向对象&接口编程 1 面向函数编程 1.1 将数据作为参数传递到函数入参 1.2 对象与函数是分离的 2 面向对象编程 2.1 使用者看起来函数作为对象的属性而非参数 2.2 函数属 ...
- golang面向对象实现
面向对象编程三大特点:封装.继承.多态. 1. 构造函数 Go不支持构造器.如果某类型的零值不可用,需要提供NewT(parameters)函数,用来初始化T类型的变量.按照Go的惯例,应该把创建T类 ...
- golang面向对象分析
说道面向对象(OOP)编程, 就不得不提到下面几个概念: 抽象 封装 继承 多态 其实有个问题Is Go An Object Oriented Language?, 随便谷歌了一下, 你就发现讨论这个 ...
- golang面向对象初识
struct是变量的集合 interface是方法的集合 struct与interface都支持匿名字段, 换言之, 支持组合实现继承. golang的struct与C++的class一样, 只能声明 ...
- Golang面向对象_继承
package main import "fmt" type Person struct { name string //名字 sex byte //性别 age int //年龄 ...
- Golang 中的 面向对象: 方法, 类, 方法继承, 接口, 多态的简单描述与实现
前言: Golang 相似与C语言, 基础语法与C基本一致,除了广受争议的 左花括号 必须与代码同行的问题, 别的基本差不多; 学会了C, 基本上万变不离其宗, 现在的高级语言身上都能看到C的影子; ...
随机推荐
- EXTJS4自学手册——报表概述
Ext画报表所涉及到的组件关系如下: Store:数据容器 Legend:图像说明 Axis:横.纵坐标 Series:报表图像
- java中string和int互相转化 (转)
1 如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([ ...
- Eclipse下Java Build Path下Libraies中添加 Maven dependencies 失败解决方案
当maven 仓库有jar时,tomcat生成时总是报javaclassno..........无这个文件:用一下方法 转载:http://bugyun.iteye.com/blog/2311848 ...
- 把sqlserver查询结果复制到Excel出现数据记录遗漏
问题:今天在sqlserver查询,总共有10000记录,把结果复制到Excel,发现少掉352条,用导出csv也是如此. 原因:经排查发现缺少的记录是因为商品名称字段包含英文双引号". 解 ...
- vb调试dll
1.有两个工程BW_DetectCard.vbp(生成dll)及识别卡检测软件.vbp(生成exe) 2.打开工程<识别卡检测软件.vbp>,在文件--添加工程--现存,找到要引用的dll ...
- 【CODEFORCES】 C. Captain Marmot
C. Captain Marmot time limit per test 1 second memory limit per test 256 megabytes input standard in ...
- Hive 作业优化
1.Join原则将条目少的表/子查询放在 Join的左边. 原因是在 Join 操作的 Reduce 阶段,位于 Join左边的表的内容会被加载进内存,将条目少的表放在左边,可以有效减少发生内存溢出的 ...
- Angularjs学习笔记10_directive3
1. restrict M 使用模板 A 属性扩展 2. template,templateUrl,$templateCache 模板缓存 //注射器加载完所有模块时,此方法执行一 ...
- Java Stream 官方文档翻译
先立个flag https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html
- 基于AR9331(MIPS架构)分析系统启动过程(uboot)
前提: 1.AR9331是基于MIPS 24K CPU的一款WIFI1X1芯片,其SDK采用uboot作为引导.AR9331中定义的基地址是:0x9f00,0000 2.MIPS24K芯片,将固定的起 ...