2.14 Go之封装简介以及实现细节
Go语言的封装概念
Go
语言的封装和java
类似,就是把对结构体字段操作的方法和结构体封装在一个.go
文件中。数据被保护在内部,程序的其它包只能通过被授权的方法,才能对字段进行操作。
封装的好处:
-
隐藏实现细节;
-
可以对数据进行验证,保证数据安全合理。
代码示例
新建员工结构体:
/* 新建一个员工数据结构体 */
type person struct {
Name string
age int // 其他包不可直接访问
salary float64
}
提供结构体构造函数:
/* 工厂模式函数,相当于构造函数,返回结构的指针对象 */
func NewPerson(name string) *person {
return &person{
Name: name,
}
}
提供属性的get
和set
方法:
/* 给person结构体的属性提供get和set方法 */
func (p *person) SetAge(age int) error {
if age > 0 && age < 60 {
p.age = age
}else {
return errors.New("年龄有误!")
}
return nil
}
func (p *person) GetAge() int {
return p.age
}
func (p *person) SetSalary(sal float64) error {
if sal > 3000 {
p.salary = sal
}else {
return errors.New("薪资有误!")
}
return nil
}
func (p *person) GetSalary() float64 {
return p.salary
}
完整代码:
package model
import "errors"
/* 新建一个员工数据结构体 */
type person struct {
Name string
age int // 其他包不可直接访问
salary float64
}
/* 工厂模式函数,相当于构造函数,返回结构的指针对象 */
func NewPerson(name string) *person {
return &person{
Name: name,
}
}
/* 给person结构体的属性提供get和set方法 */
func (p *person) SetAge(age int) error {
if age > 0 && age < 60 {
p.age = age
}else {
return errors.New("年龄有误!")
}
return nil
}
func (p *person) GetAge() int {
return p.age
}
func (p *person) SetSalary(sal float64) error {
if sal > 3000 {
p.salary = sal
}else {
return errors.New("薪资有误!")
}
return nil
}
func (p *person) GetSalary() float64 {
return p.salary
}
在main目录下进行调用
package main
import (
"GoPracticePakage/Practice_Pakage/model"
"fmt"
)
func main() {
// 新建model对象
p := model.NewPerson("Lucifer")
p.SetAge(22)
p.SetSalary(12000)
fmt.Println(p)
fmt.Println(p.Name, "年龄=", p.GetAge(), "薪资=", p.GetSalary())
}