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())
}
    It's a lonely road!!!
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号