golang面向对象编程思想-封装

封装就是将抽象出来的字段和对字段的操作封装在一起,数据被保护在内部,程序的其他包只有通过授权的操作(方法),才能对字段进行操作。现实中对电视机的操作就是典型的封装。

1. 实现封装的步骤
  • 将结构体、字段(属性)的首字母小写(不能导出,其他包不能使用,类似private)
  • 给结构体所在的包提供一个工厂模式的函数,首字母大写,类似一个构造函数
  • 提供一个首字母大写的Set方法,用于对属性判断并赋值
  • 提供一个首字母大写的Get方法用于获取属性的值

例子:
一个人的年龄和工资是属于隐私信息,我们如何实现封装,代码如下:
项目结构图:
image
person.go

package model

import "fmt"

type person struct {
	Name string  // 名字
	age  int     //年龄 其他包不可用
	sal  float64 //工资 其他包不可用
}

// 写一个工厂模式的函数,相当于构造函数
func NewPerson(name string) *person {
	return &person{
		Name: name,
	}
}

// 为age和sal编写一对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) SetSal(sal float64) {
	if sal > 0 {
		p.sal = sal
	} else {
		fmt.Println("薪水范围不正确")
	}
}

func (p *person) GetSal() float64 {
	return p.sal
}

main.go

package main

import (
	"fmt"
	"model"
)

func main() {
	p := model.NewPerson("小王")
	fmt.Println("p=", *p)
	p.SetAge(20)
	p.SetSal(5000)
	fmt.Printf("%v年龄是%v,薪水是%v\n", p.Name, p.GetAge(), p.GetSal())
}

输出结果:

p= {小王 0 0}
小王年龄是20,薪水是5000
posted @ 2021-05-31 22:39  若雨蚂蚱  阅读(80)  评论(0编辑  收藏  举报