美文网首页
go面向对象-三大特性之封装

go面向对象-三大特性之封装

作者: StevenQin | 来源:发表于2019-09-28 22:43 被阅读0次

    封装的理解和好处

    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)
        }
    }
    

    相关文章

      网友评论

          本文标题:go面向对象-三大特性之封装

          本文链接:https://www.haomeiwen.com/subject/inhxpctx.html