封装介绍:
封装(encapsulation) 就是把抽象出的字段和对字段的操作封装在一起,数据被保护在内部,程序的其它包只有通过被授权的操作(方法),才能对字段进行操作。
封装的理解和好处:
1)隐藏实现细节
2)提可以对数据进行验证,保证安全合理
type Person struct {
Age int
}
如何体现封装:
1)对结构体中的属性进行封装
2)通过方法,包 实现封装
封装的实现步骤:
1)将结构体、字段(属性)的首字母小写(不能导出了,其它包不能使用,类似private)
2)给结构体所在包提供一个工厂模式的函数,首字母大写。类似一个构造函数。
3)提供一个首字母大写的Set方法(类似其它语言的public),用于对属性判断并赋值
func (var 结构体类型名) SetXxx(参数列表) (返回值列表) {
//加入数据验证的业务逻辑
var.字段 = 参数
}
4)提供一个首字母大写的Get方法(类似其它语言的public),用于获取属性的值
func (var 结构体类型名) GetXxx() {
return var.字段;
}
特别说明:在Golang开发中并没有特别强调封装,这点并不像java,不要总是用java的语法特性来看待Golang,Golang本身对面向对象的特性做了简化的。
快速入门案例:
看一个程序(person.go),不能随便查看人的年龄,工资等隐私,并对输入的年龄进行合理的验证。
代码实现:
model/person.go
package model
import "fmt"
//定义一个结构体
type person struct {
Name string
age int
sal float64
}
//写一个工厂模式的函数,相当于构造函数
func NewPerson(name string) *person {
return &person{
Name : name,
}
}
//为了访问age 和 sal 我们编写一对SetXxx的方法和GetXxx的方法
func (p *person) SetAge(age int) {
if age > 0 && age < 150 {
p.age = age
} else {
fmt.Println("年龄范围不正确..")
//有些程序员给一个默认值,看自己需求。
}
}
func (p *person) GetAge() int {
return p.age
}
func (p *person) SetSal(sal float64) {
if sal >= 3000 && sal <= 30000 {
p.sal = sal
} else {
fmt.Println("薪水范围不正确..")
}
}
func (p *person) GetSal() float64 {
return p.sal
}
main/main.go
package main
import (
"fmt"
"chapter04/chapter08/model"
)
func main() {
p := model.NewPerson("smith")
p.SetAge(18)
p.SetSal(5000)
fmt.Println(p)
fmt.Println("name=", p.Name, "age=", p.GetAge(), "sal=", p.GetSal())
}
执行的结果: