相信你一定记得面向对象编程的三大特性:继承,封装和多态!Go语言作为现代编程语言,当然也是支持封装的,只不过和其他的OOP语言会有一些不一样而已?具体是什么不一样的呢?下面我们就来揭开它的神秘面纱!
一、啥是封装?
封装(encapsulation)就是把抽象出的字段和对字段的操作封装在一起,数据被保护在内部,程序的其它包只有通过被授权的操作(方法),才能对字段进行操作。
来,哥保护你!封装之后,可以带来以下好处:
- 因为调用方不能直接修改对象的变量值,其只需要关注少量的语句并且只要弄懂少量变量的可能的值即可
- 隐藏实现细节,可以防止调用方依赖那些可能变化的具体实现,这样使设计包的程序员在不破坏对外的api情况下能得到更大的自由
- 可以对数据进行验证,保证安全合理,阻止了外部调用方对对象内部的值任意地进行修改,比如月份的取值范围等
所以,我们如果不想让某些变量或者方法对调用者可见的话,那就可以把它“封装”起来,这样就可以达到“信息隐藏”的目的啦~
二、如何实现封装?
Go语言只有一种控制可见性的手段:大写首字母的标识符会从定义它们的包中被导出,小写字母的则不会。
- 将结构体、字段(属性)的首字母小写(不能导出了,其它包不能使用,类似 private)
- 给结构体所在包提供一个工厂模式的函数,首字母大写。类似一个构造函数
- 提供一个首字母大写的 Set 方法(类似其它语言的 public),用于对属性判断并赋值
- 提供一个首字母大写的 Get 方法(类似其它语言的 public),用于获取属性的值
func (var 结构体类型名) SetXxx(参数列表) (返回值列表) {
//加入数据验证的业务逻辑
var.字段 = 参数
}
func (var 结构体类型名) GetXxx() {
return var.age;
}
这就是Go语言中的封装。另外,通过我们把struct看做类,struct中可以包含其他的struct,继承内部struct的方法和变量,同时可以重写,这样来实现OOP的继承。不过Go语言中的多态比Java的隐匿得多,严格上说没有多态,但可以利用接口进行,对于都实现了同一接口的两种对象,可以进行类似地向上转型,并且在此时可以对方法进行多态路由分发。
继承的知识点就总结到这里了,你学会了吗?