学习过Python或者java的朋友,都会习惯里面的类,而Golang中是没有类的概念,而有相似的概念结构体,结构体是一款功能强大的数据类型,可以简单的实现其余语言中类实现的功能,可以序列化json,支持继承,在继承时,继承父结构体的属性和父结构体的方法。同时结构体也像其余数据结构和函数同样,以大写字母开头的结构体可以导出本包,应用到其余包。而当开始定义的一些小写字母定义的结构体,咱们想要用于其余包的时候,能够用工厂函数的方式实现。此外能够使用工厂函数结合定义某些方法实现面向对象的封装特性。java
封装的介绍:json
封装(encapsulation)就是把抽象出的字段和对字段的操做封装在一块儿,数据被保护在内部,程序的其 它包只有经过被受权的操做(方法),才能对字段进行操做。安全
封装的理解和好处:bash
1) 隐藏实现细节数据结构
2) 能够对数据进行验证,保证安全合理(某些字段)ide
如何体现封装
1) 对结构体中的属性进行封装函数
2) 经过方法,包 实现封装学习
封装的实现步骤
spa
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 自己对面向对象的特性作了简化的.
相关示例
package person import "fmt" //定义不能导出的结构体 type person struct { Name string age int sal float64 } //定义工厂模式的函数 首字母大写 相似构造函数 func NewPerson(name string) *person{ return &person{ Name:name, } } //提供一个Set方法 设置年龄 func (user *person) Setage(age int) { if age >0 && age < 150 { user.age = age }else { fmt.Println("年龄数值不对!") } } //获取年龄 func (user *person) Getage() int{ return user.age } //更改年龄 func (user *person) Updateage(age int) int{ user.age =age return user.age } //更改姓名 func (user *person) Updatename(name string) string{ user.Name=name return user.Name }
在另外一个包中调用person
main ( ) () { person.() fmt.() .() fmt.() .() fmt.() .() fmt.() fmt.() .() fmt.() }
结果