Golang中--面向对象封装
学习过Python或者java的朋友,都会习惯里面的类,而Golang中是没有类的概念,而有类似的概念结构体,结构体是一款功能强大的数据类型,能够简单的实现其他语言中类实现的功能,能够序列化json,支持继承,在继承时,继承父结构体的属性和父结构体的方法。同时结构体也像其他数据结构和函数一样,以大写字母开头的结构体能够导出本包,应用到其他包。而当开始定义的一些小写字母定义的结构体,我们想要用于其他包的时候,可以用工厂函数的方式实现。此外可以使用工厂函数结合定义某些方法实现面向对象的封装特性。
封装的介绍:
封装(encapsulation)就是把抽象出的字段和对字段的操作封装在一起,数据被保护在内部,程序的其它包只有通过被授权的操作(方法),才能对字段进行操作。
封装的理解和好处:
1) 隐藏实现细节
2) 可以对数据进行验证,保证安全合理(某些字段)
如何体现封装
1) 对结构体中的属性进行封装
2) 通过方法,包 实现封装
封装的实现步骤
1) 将结构体、字段(属性)的首字母小写(不能导出了,其它包不能使用,类似 private)
2) 给结构体所在包 供一个工厂模式的函数,首字母大写。类似一个构造函数
3) 供一个首字母大写的 Set 方法(类似其它语言的 public),用于对属性判断并赋值
func (var 结构体类型名) SetXxx(参数列表) (返回值列表) {
//加入数据验证的业务逻辑
var.字段 = 参数}
4) 供一个首字母大写的 Get 方法(类似其它语言的 public),用于获取属性的值func (var 结构体类型名) GetXxx() {
return var.age;}
特别说明:在 Golang 开发中并没有特别强调封装,这点并不像 Java. 所以 醒学过 java 的朋友,不用总是用 java 的语法特性来看待 Golang, Golang 本身对面向对象的特性做了简化的.
相关示例
packagepersonimport"fmt"//定义不能导出的结构体typepersonstruct{Namestringageintsalfloat64}//定义工厂模式的函数首字母大写类似构造函数funcNewPerson(namestring)*person{return&person{Name:name,}}//提供一个Set方法设置年龄func(user*person)Setage(ageint){ifage>0&&age<150{user.age=age}else{fmt.Println("年龄数值不对!")}}//获取年龄func(user*person)Getage()int{returnuser.age}//更改年龄func(user*person)Updateage(ageint)int{user.age=agereturnuser.age}//更改姓名func(user*person)Updatename(namestring)string{user.Name=namereturnuser.Name}
在另一个包中调用person
main()(){person.()fmt.().()fmt.().()fmt.().()fmt.()fmt.().()fmt.()}
结果
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。