【一Go到底】第四十二天---面向对象编程之封装介绍

90 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第42天,点击查看活动详情

面向对象三大特性基本介绍

Golang仍然有面向对象编程的继承,封装和多态的特性,只是实现的方式和其它OOP语言不一样

一、封装

封装(encapsulation)就是把抽象出的字段和对字段的操作封装在一起数据被保护在内部,程序的其它包只有通过被授权的操作(方法),才能对字段进行操作。

1.1 封装的理解和好处

  1. 隐藏实现细节
  2. 可以对数据进行验证,保证安全合理.

1.2 如何体现封装

  1. 对结构体中的属性进行封装.
  2. 通过方法,包实现封装

1.3

  1. 将结构体、字段(属性)的首字母小写(不能导出了,其它包不能使用,类似private)
  2. 给结构体所在包提供一一个工厂 模式的函数,首字母大写。类似一个构造函数
  3. 提供一个首字母大写的Set方法(类似其它语言的public),用于对属性判断并赋值
func (var结构体类型名) Setxxx(参数列表) (返回值列表) {
    //加入数据验证的业务逻辑
    var.字段=参数
}
  1. 提供一个首字母大写的Get方法(类似其它语言的public),用于获取属性的值
func (var结构体类型名) GetXxx() {
return var.字段

注意:特别说明:在Golang开发中并没有特别强调封装,这点并不像Java. Golang本身对面向对象的特性做了简化的.

二、封装快速入门案例

编写一个person.go程序,不能随便查看人的年龄,工资等隐私,并对输入的年龄进行验证 设计

  1. model包---》 person.go
  2. 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())
}