go面向对象-三大特性之封装
2019-09-28 本文已影响0人
StevenQin
封装的理解和好处
1、隐藏实现细节
2、可以对数据进行验证,保证安全合理
如何体现封装
1、对结构体中的属性进行封装
2、通过方法、包 实现封装
快速入门
- 文件结构
model文件夹下面有model.go main文件夹下面main.go
model.go代码:
package model
import "fmt"
type person struct {
Name string
age int //其它包不能直接访问
sal float64
}
//写一个工厂模式的函数,相当于构造函数
func NewPerson(name string) *person {
return &person{
Name: name,
}
}
//访问age的方法
func (p *person) SetAge(age int) {
if age >0 && age <150{
p.age = age
}else {
fmt.Println("年龄不合理")
}
}
//读取age的方法
func (p *person) GetAge() int {
return p.age
}
//访问sal的方法
func (p *person) SetSal(sal float64) {
if sal >=3000 && sal <=30000{
p.sal = sal
}else{
fmt.Println("薪水不符合要求")
}
}
//读取sal的方法
func (p *person) GetSal() float64 {
return p.sal
}
main.go代码
package main
import (
"fmt"
"go_demo/factory/model"
)
func main() {
p :=model.NewPerson("steven.qin")
p.SetAge(30)
p.SetSal(30000)
fmt.Println(*p)
fmt.Println("age = ",p.GetAge()," sal = ",p.GetSal())
}
练习:银行帐号
model.go
package model
import "fmt"
type account struct {
accountNo string
pwd string
balance float64
}
//工厂模式 相当于构造函数
func NewAccount(accountNo string, pwd string, balance float64) *account {
if len(accountNo) < 6 || len(accountNo) > 10 {
fmt.Println("账号的长度不对....")
return nil
}
if len(pwd) != 6 {
fmt.Println("密码的长度不对...")
return nil
}
if balance < 20 {
fmt.Println("余额数目不对")
return nil
}
return &account{
accountNo: accountNo,
pwd: pwd,
balance: balance,
}
}
func (a *account) SetAccountNo(accountNo string) {
if len(accountNo) < 6 || len(accountNo) > 10 {
fmt.Println("账号的长度不对....")
return
}
a.accountNo = accountNo
}
main.go
package main
import (
"fmt"
"go_demo/factory/model"
)
func main() {
accout :=model.NewAccount("rc0011122","78907800",22)
if accout == nil{
fmt.Println("创建失败")
}else{
fmt.Println("account = ",accout)
}
}