go 封装

1. 基本介绍

Golang 仍然有面向对象编程的继承,封装和多态的特性,只是实现的方式和其它 OOP 语言不一样,下面我们一一为同学们进行详细的讲解 Golang 的三大特性是如何实现的。

2. 封装介绍

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

3. 封装的理解和好处

  1) 隐藏实现细节

  2) 提可以对数据进行验证,保证安全合理(Age)

4. 如何体现封装

  1) 对结构体中的属性进行封装

  2) 通过方法,包包实现封装

5. 封装的实现步骤

  1) 将结构体、字段(属性)的首字母小写(不能导出了,其它包不能使用,类似 private)

  2) 给结构体所在包提供一个工厂模式的函数,首字母大写。类似一个构造函数

  3) 提供一个首字母大写的 Set 方法(类似其它语言的 public),用于对属性判断并赋值

  可参考工厂模式

func (var 结构体类型名) SetXxx(参数列表) (返回值列表) {
    //加入数据验证的业务逻辑
    var.字段 = 参数
}

  4) 提供一个首字母大写的 Get 方法(类似其它语言的 public),用于获取属性的值

func (var 结构体类型名) GetXxx() {
    return var.age;
}

  

特别说明:在 Golang 开发中并没有特别强调封装,这点并不像 Java. 所以提醒学过 java 的朋友,不用总是用 java 的语法特性来看待 Golang, Golang 本身对面向对象的特性做了简化的。

person.go

package model

import "fmt"

type person struct {
	Name string
	age  int // 其它包不能直接访问
	sal  float64
}

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

// 为了访问sal和age,我们编写一对SetXXX和GetXXX的方法
func (p *person) Setage(a int) {
	if a > 0 && a < 150 {
		p.age = a
	} else {
		fmt.Println("您输入的年龄不正确!")
	}
}

func (p *person) Getage() int {
	return p.age
}

func (p *person) Setsal(s float64) {
	if s >= 3000 && s <= 30000 {
		p.sal = s
	} else {
		fmt.Println("薪水范围不正确!")
	}
}

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

  

main.go

package main

import (
	"0426/model"
	"fmt"
)

func main() {
	p := model.Newperson("sonder")
	p.Setage(23)
	p.Setsal(4500)
	// p.Getage()
	fmt.Println(p)
	fmt.Println(p.Getage())
	fmt.Println(p.Getsal())
}

  

posted @ 2020-04-26 18:38  枯藤老艹树  阅读(637)  评论(0编辑  收藏  举报