【Go语言】封装

316 阅读5分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第16天,点击查看活动详情

封装的实现分析

1. 结构:

func (var 结构体类型名) SetXxx(参数列表) (返回值列表) {

// 加入数据验证的业务逻辑

var.字段 = 参数

}

结构解析: img

解析:在Go语言中封装就是把抽象出来的字段和对字段的操作封装在一起,数据被保护在内部,程序的其它包只能通过被授权的方法,才能对字段进行操作。封装的实现主要体现在对结构体中的属性进行封装,通过方法或包 ,实现封装。注意的是Golang开发并没有特别强调封装,这点并不像Java,不用总是用Java的语法特性来看待Golang,Golang本身对面向对象的特性就做了简化。

2.举例:声明一个结构体,要通过函数封装实现对结构体输出:

 // 公司结构体
 type Company struct {                                            //结构体声明
    name       string
    address    string
    website    string
    createDate int
 }
 func main() {                                                        //主函数
    p := NewPerson("知链")
    p.SetCompany(2018)
    fmt.Println(p)
    fmt.Println(p.name, " createDate = ", p.GetCompany())
 }
 func NewPerson(name string) *Company {                         //工程函数构建
    return &Company{
       name: name,
    }
 }
 // 设置get方法,有返回值
 func (p *Company) GetCompany() int {                            //函数方法封装
    return p.createDate
 }
 // SetCompany 为了访问age 和 sal 我们编写一对SetXxx的方法和GetXxx的方法
 func (p *Company) SetCompany(createDate int) {                //函数方法封装
    if createDate < 2022 && createDate > 1949 {
       p.createDate = createDate
    } else {
       fmt.Println("创建时间范围不正确..")
       //给程序员给一个默认值
    }
 }

终端输出:img

结构解析:

 type Company struct {                                            //结构体声明
    name       string
    address    string
    website    string
    createDate int
 }

结构体声明: 在Go语言中提供了一种自定义数据类型,可以封装多个基本数据类型,这种数据类型叫结构体,英文名称 struct 。结构体是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体。每个值称为结构体的成员。且Go语言中一般通过结构体(struct)来实现面向对象。,另外结构体通过关键字type来命名标识符再通过明确字段名的的数据类型来完成结构体的成员完整声明过程。

 func main() {                                                        //主函数
    p := NewPerson("知链")                                           //参数赋值
    p.SetCompany(2018)
    fmt.Println(p)                                                 //语句&表达式输出
    fmt.Println(p.name, " createDate = ", p.GetCompany())
 }

主函数: func main() 是程序开始执行的函数。main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数(如果有 init() 函数则会先执行该函数)。函数执行开始后,函数内语句依照main()函数内依次执行。

细化分析:

 p := NewPerson("知链")                                         //参数赋值
 p.SetCompany(2018)

参数赋值:在Go语言中封装就是把抽象出来的字段和对字段的操作封装在一起,数据被保护在内部,程序的其它包只能通过被授权的方法,才能对字段进行操作。对函数的直接调用,将数据赋值给封装的函数方法。

 fmt.Println(p)                                                //语句&表达式输出
 fmt.Println(p.name, " createDate = ", p.GetCompany())

语句&表达式输出: fmt.Println(...) 可以将字符串输出到控制台,并在最后自动增加换行字符 \n。函数内语句依照函数内的编译顺序依次执行。输出语句在调用函数方法后获取到输出结果进行打印。

 func NewPerson(name string) *Company {                         //工厂函数构建
    return &Company{
       name: name,
    }
 }

工程函数构建: 写一个工厂模式的函数,相当于构建函数,通过对结构体的实例化赋值操作,由于不会暴露创建的函数逻辑可以有效地减少泄露并且通过使用共同接口会指向创建对像。

 // 设置get方法,有返回值
 func (p *Company) GetCompany() int {                            //函数方法封装
    return p.createDate
 }
 // SetCompany 为了访问age 和 sal 我们编写一对SetXxx的方法和GetXxx的方法
 func (p *Company) SetCompany(createDate int) {                //函数方法封装
    if createDate < 2022 && createDate > 1949 {                 //if else判断
       p.createDate = createDate
    } else {
       fmt.Println("创建时间范围不正确..")
       //给程序员给一个默认值
    }
 }

函数方法封装:* 在Go语言中封装就是把抽象出来的字段和对字段的操作封装在一起,数据被保护在内部,程序的其它包只能通过被授权的方法,才能对字段进行操作。封装的实现主要体现在对结构体中的属性进行封装,通过方法或包 ,实现封装。封装完成之后,进行结构体实例化,才能调用封装结构体的方法,实现业务操作。*

细化分析:

 if createDate < 2022 && createDate > 1949 {                 //if else判断
       p.createDate = createDate
    } else {
       fmt.Println("创建时间范围不正确..")
       //给程序员给一个默认值
    }

if else* 判断:* if* 条件语句需要开发者通过指定一个或多个条件,并通过测试条件是否为 true 来决定是否执行指定语句,并在条件为 false 的情况在执行另外的语句。此语句中先执行判断语句如果判断结果为true,则执行第一个条件下的语句表达式,若为false则继续往下判断执行第二个语句判断,如果判断结果为true,则执行第二个语句表达式,如此往复知道输出结束。*