• 2.14 Go之封装简介以及实现细节


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

    提供属性的getset方法:

    /* 给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())
    }

     

  • 相关阅读:
    前端PC人脸识别登录
    html2canvas 轮播保存每个图片内容
    基于Element的下拉框,多选框的封装
    聊聊 HTTPS
    从 rails 窥探 web 全栈开发(零)
    理解 Angular 服务
    Vue3 与依赖注入
    一次 HTTP 请求就需要一次 TCP 连接吗?
    GO 语言入门(一)
    读 Angular 代码风格指南
  • 原文地址:https://www.cnblogs.com/JunkingBoy/p/15944356.html
Copyright © 2020-2023  润新知