golang面向对象编程思想-封装
封装就是将抽象出来的字段和对字段的操作封装在一起,数据被保护在内部,程序的其他包只有通过授权的操作(方法),才能对字段进行操作。现实中对电视机的操作就是典型的封装。
1. 实现封装的步骤
- 将结构体、字段(属性)的首字母小写(不能导出,其他包不能使用,类似private)
- 给结构体所在的包提供一个工厂模式的函数,首字母大写,类似一个构造函数
- 提供一个首字母大写的Set方法,用于对属性判断并赋值
- 提供一个首字母大写的Get方法用于获取属性的值
例子:
一个人的年龄和工资是属于隐私信息,我们如何实现封装,代码如下:
项目结构图:
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 > 0 {
p.sal = sal
} else {
fmt.Println("薪水范围不正确")
}
}
func (p *person) GetSal() float64 {
return p.sal
}
main.go
package main
import (
"fmt"
"model"
)
func main() {
p := model.NewPerson("小王")
fmt.Println("p=", *p)
p.SetAge(20)
p.SetSal(5000)
fmt.Printf("%v年龄是%v,薪水是%v\n", p.Name, p.GetAge(), p.GetSal())
}
输出结果:
p= {小王 0 0}
小王年龄是20,薪水是5000