main.go
package main
import (
"fmt"
"github.com/面向对象编程/面向对象编程思想/封装/model"
)
/*
封装(encapsulation)就是把抽象出的字段和字段的操作封装在一起,
数据被保护在内部,程序的其他包只有通过被授权的操作,才能对字段进行操作
封装的理解和好处
1.隐藏实现细节
2.可以对数据进行验证,保证安全合理
如何体现封装
1.对结构体中的属性进行封装
2.通过方法,包实现封装
实现步骤
1.将结构体、字段的首字母小写(不能导出,其他包不能使用)
2.给结构体所在包提供一个工厂模式的函数,首字母大写。类似一个构造函数
3.提供一个首字母大写的Set方法,用于对属性判断并赋值
func (var 结构体类型名) SetXxx(参数列表)(返回值列表){
var.字段 = 参数
}
4.提供一个首字母大写的Get方法,用于获取属性的值
func (var 结构体类型名) GetXxx(){
return var.字段
}
*/
//不能随便查看人的年龄,工资等隐私,并对输入的年龄进行合理验证
//model包(person.go)main包(main.go调用Person结构体)
func main() {
person := model.NewPerson("smith")
person.SetAge(18)
person.SetSal(15000)
fmt.Println(person)
fmt.Println("姓名为", person.Name, "年龄为", person.GetAge(), "薪水为", person.GetSal())
}
person.go
package model
import "fmt"
type person struct {
Name string
age int //其他包不能访问
sal float64
}
//写一个工厂模式函数,相当于构造函数
func NewPerson(name string) *person {
return &person{
Name: name,
}
}
func (p *person) SetAge(age int) {
if age > 0 && age < 200 {
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
}