持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第42天,点击查看活动详情
面向对象三大特性基本介绍
Golang仍然有面向对象编程的继承,封装和多态的特性,只是实现的方式和其它OOP语言不一样
一、封装
封装(encapsulation)就是把抽象出的字段和对字段的操作
封装在一起数据被保护在内部,程序的其它包只有通过被授权的操作(方法),才能对字段进行操作。
1.1 封装的理解和好处
- 隐藏实现细节
- 可以对数据进行验证,保证安全合理.
1.2 如何体现封装
- 对结构体中的属性进行封装.
- 通过方法,包实现封装
1.3
- 将结构体、字段(属性)的首字母小写(不能导出了,其它包不能使用,类似private)
- 给结构体所在包提供一一个工厂 模式的函数,首字母大写。类似一个构造函数
- 提供一个首字母大写的Set方法(类似其它语言的public),用于对属性判断并赋值
func (var结构体类型名) Setxxx(参数列表) (返回值列表) {
//加入数据验证的业务逻辑
var.字段=参数
}
- 提供一个首字母大写的Get方法(类似其它语言的public),用于获取属性的值
func (var结构体类型名) GetXxx() {
return var.字段
注意:特别说明:在Golang开发中并没有特别强调封装,这点并不像Java. Golang本身对面向对象的特性做了简化的.
二、封装快速入门案例
编写一个person.go程序,不能随便查看人的年龄,工资等隐私,并对输入的年龄进行验证 设计
- model包---》 person.go
- main包调用Person结构体
2.1 model包
package model
import "fmt"
type person struct {
Name string
age int // 其他包无法访问
salary float64 // // 其他包无法访问
}
// 写一个工厂模式函数,构造函数
func NewPerson(name string) *person {
return &person{
Name: name,
}
}
// 为了访问结构体中的age 和 salary,编写一对Setxxx和Getxxx方法
func (p *person) SetAge(age int) {
if age > 0 && age < 150 {
p.age = age
} else {
fmt.Println("年龄范围不正确.......")
}
}
func (p *person) GetAge() int {
return p.age
}
func (p *person) SetSalary(salary float64) {
if salary > 3000 && salary < 100000 {
p.salary = salary
} else {
fmt.Println("工资范围不正确.......")
}
}
func (p *person) GetSalary() float64 {
return p.salary
}
2.2 main
package main
import (
// "go_code/chapter28-encapsulate/model"
"fmt"
"go_code/chapter28-encapsulate/model"
)
/*
**编写一个person.go程序,不能随便查看人的年龄,工资等隐私,并对输入的年龄进行验证**
**设计**
1. model包---》 person.go
2. main包调用Person结构体
*/
func main() {
// 定义变量
p := model.NewPerson("阿里")
// default p = {阿里 0 0}
fmt.Println("default p = ", *p)
// 对年龄、薪水赋值
// 先调用Setxxxx
p.SetAge(20)
p.SetSalary(4000)
// first set Value = {阿里 20 4000}
fmt.Println("first set Value = ", *p)
// 取年龄 薪水的值
// 阿里 的年龄 20 岁, 薪水 4000 元
fmt.Printf("%v 的年龄 %v 岁, 薪水 %v 元", p.Name, p.GetAge(), p.GetSalary())
}