一.封装:
封装就是把抽象出的字段和对字段的操作封装在一起,数据被保护在内部,程序其他包只能通过被授权的操作(方法),才能对字段进行操作。
封装的理解和好处:隐藏实现细节,提可以对数据进行验证,保证安全合理
如何体现封装:对结构体中的属性进行封装,通过方法,包 实现封装
封装的实现步骤
(1)将结构体、字段(属性)的首字母小写(不能导出了,其他包不能使用,类似private)
(2)给结构体所在包提供一个工程模式的函数,首字母大写。类似构造一个函数
(3)提供一个首字母大写的Set方法(类似其他语言的public),用于对属性判断并赋值
func (var 结构体类型名) SetXxx(参数列表)(返回值列表){
//加入数据验证的业务逻辑
var.字段 = 参数
}
(4) 提供一个首字母大写的Get方法(类似其他语言的public),用于获取属性的值
func (var结构体类型名)GetXxx(){
return var.字段
}
特别说明:在Golang开发中并没有特别强调封装,这点并不像Java,Golang本身对面向 对象的特性做了简化的。
案例:
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
}
package main
import(
"fmt"
"go_code/GO/demo02"
)
func main(){
P := model.NewPerson("smith")
//p.age = 18 这样调用是调用不到的
p.SetAge(18)
p.SetSal(5000)
fmt.Println(p.Name," age =",p.GetAge()," sal= ",p.GetSal())
}