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)
    }
}
上一篇下一篇

猜你喜欢

热点阅读