浅谈GO语言中的面向对象

前言

如果说最纯粹的面向对象语言,我觉得是Java无疑。而且Java语言的面向对象也是很直观,很容易理解的。class是基础,其他都是要写在class里的。

最近学习了Go语言,有了一些对比和思考。虽然我还没有完全领悟Go语言“Less is more”的编程哲学,思考的方式还是习惯从Java的角度出发,但是我还是深深的喜欢上了这门语言。

这篇文章仅是我学习过程中的一些想法,欢迎留言探讨,批评指正。

 

封装

Java中的封装

Java语言中,封装是自然而来的,也是强制的。你所写的代码,都要属于某个类,某个class文件。类的属性封装了数据,方法则是对这些数据的操作。通过private和public来控制数据的可访问性。

每个类(java文件),自然的就是一个对象的模板。

Go中的封装

Go语言并不是完全面向对象的。其实Go语言中并没有类和对象的概念。

首先,Go语言是完全可以写成面向过程风格的。Go语言中有很多的function是不属于任何对象的。(以前我写过一些ABAP语言,ABAP是从面向过程转为支持面向对象的语言,所以也是有类似的function的)。

然后,Go语言中,封装有包范围的封装和结构体范围的封装。

在Java语言中,我们组织程序的方式一般是通过project-package-class。每个class,对应一个文件,文件名和class名相同。其实我觉得这样组织是很清晰也很直观的。

在Go语言中,只有一个package的概念。package就是一个文件夹。在这个文件夹下的所有文件,都是属于这个package的。这些文件可以任意起名字,只要在文件头加上package名字

package handler

那么这个文件就是属于这个package的。在package内部所有的变量是互相可见的,是不可以重复的。

你可以这样理解:文件夹(package)就是你封装的一个单元(比如你想封装一个Handler处理一些问题)。里边其实只有一个文件,但是为了管理方便,你把它拆成了好几个文件(FileHandler、ImageHandler、HTTPHandler、CommonUtils),但其实这些文件写成一个和写成几个,他们之间的变量都是互相可见的。

如果变量是大写字母开头命名,那么对包外可见。如果是小写则包外不可见。

其实一开始我是很不习惯这种封装方式的,因为写Java的时候是难以想象一个文件里的变量在另一个文件里也可见的。

Go中的另外一种封装,就是结构体struct。没错,类似C语言中的struct,我们把一些变量用一个struct封装在一起

type Dog struct {

    Name string

    Age  int64

    Sex  int

}

 

我们还可以给struct添加方法,做法就是把一个function指定给某个struct。

func (dog *Dog) bark() {

    fmt.Println("wangwang")

} 

 

这时候看起来是不是很有面向对象的感觉了?起码我们有对象(struct)和方法(绑定到struct的function)了,是不是?具体的Go语法不在这里过多探讨。

继承

封装只是基础,为继承和多态提供可能。继承和多态才是面向对象最有意思也最有用的地方。

Java中的继承

Java语言中,继承通过extends关键字实现。有非常清晰的父类和子类的概念以及继承关系。Java不支持多继承。

Go中的继承

Go语言中其实并没有继承。看到这里你可能会说:什么鬼?面向对象语言里没有继承?好吧其实一开始我也是懵逼的。但是Go中确实只是提供了一种伪继承,通过embedding实

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值