封装
封装
-
什么是封装:
封装(encapsulation)就是把抽象出的字段和对字段的操作封装在一起,数据被保护在内部,程序的其他包只有通过被授权的操作方法,才能对字段进行操作。
-
封装的好处:
- 隐藏实现细节
- 提可以对数据进行验证,保证安全合理
-
Golang中如何实现封装:
-
建议将结构体、字段(属性)的首字母小写其他包不能使用,类似private,实际开发不小写也可能,因为封装没有那么严格)
-
给结构体所在包提供一个工厂模式的函数吗,首字母大写(类似一个构造函数)
-
提供一个首字母大写的Set方法(类似其他语言的public),用于对属性判断并赋值
func (var 结构体类型名)SetXxx(参数列表){ //加入数据验证的业务逻辑 var.Age = 参数 } -
提供一个首字母大写的Get方法(类似其他语言的public),用于获取属性的值
func (var 结构体类型名) GetXxx() (返回值列表) { return var.字段 }
-
-
代码实现:

//person.go
package model
import "fmt"
type person struct {
Name string
age int //其他包不能直接访问
}
// 定义工厂模式的函数,相当于构造器
func NewPerson(name string) *person {
return &person{
Name: name,
}
}
//定义set和get方法,对age字段进行封装,因为在方法中可以加一系列的限制操作,可以确保被封装字段的安全合理性
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
}
//main.go
package main
import (
"fmt"
"demo12/model" // 引入跨包的Person结构体
)
func main() {
//创建person结构体实例
p := model.NewPerson("小明")
p.SetAge(20)
fmt.Println(p.Name)// 调用Name字段,直接访问
fmt.Println(p.GetAge())// 调用GetAge方法获取age字段的值
fmt.Println(*p)// 调用p的值,输出整个结构体
}

浙公网安备 33010602011771号