封装

封装

  1. 什么是封装:

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

  2. 封装的好处:

    1. 隐藏实现细节
    2. 提可以对数据进行验证,保证安全合理
  3. Golang中如何实现封装:

    1. 建议将结构体、字段(属性)的首字母小写其他包不能使用,类似private,实际开发不小写也可能,因为封装没有那么严格)

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

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

      func (var 结构体类型名)SetXxx(参数列表){
      	//加入数据验证的业务逻辑
      	var.Age = 参数
      }
      
    4. 提供一个首字母大写的Get方法(类似其他语言的public),用于获取属性的值

      func (var 结构体类型名) GetXxx() (返回值列表) {
      	return var.字段
      }
      
  4. 代码实现:

image

//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的值,输出整个结构体
}

posted @ 2025-07-02 18:11  hutaodd  阅读(22)  评论(0)    收藏  举报