Go语言中面向对象的三大特性之封装的理解

封装是面向对象的三大特性之一(封装、继承、多态),目的是隐藏实现细节、保护数据安全。

封装=隐藏数据+提供方法

核心规则

  • 通过包(package)控制访问权限
  • 通过首字母大小写控制公开/私有

但是也有一种情况,比如在JSON序列化需要的时候,它的字段会大写,否则JSON序列化会忽略,

关键点:

场景 字段大小写 原因
内部 model 小写 id 私有数据,外部不直接访问
序列化输出 大写 ID 需要导出给 JSON 编码器

内部model:

规则 示例 访问范围
大写开头 SetPassword 任何包都能访问
小写开头 setPassword 只有本包能访问

有封装和无封装的对比:

没有封装:

Go 复制代码
// 任务数据裸露在外,任何人都可以直接修改
type Task struct {
    ID     uint
    Title  string
    Status int  // 0=待办,1=完成
}

// 任何人都可以直接改
task.Status = 100  // 状态值变成 100,逻辑上不对,但没人拦着

有封装:(隐藏细节)

Go 复制代码
type Task struct {
    id     uint       // 小写开头,外部看不到
    title  string     // 小写开头,外部看不到
    status int        // 小写开头,外部看不到
}

// 只暴露安全的操作方法
func (t *Task) MarkDone() {
    t.status = 1  // 内部修改
}

func (t *Task) IsDone() bool {
    return t.status == 1  // 内部判断
}

字段封装:

Go 复制代码
// model/user.go
type User struct {
    gorm.Model
    UserName       string  // 公开 - 别人可以看到用户名
    PasswordDigest string  // 公开 - 名字暴露了这是密码摘要
}

举个例子:(计数器)

定义一个结构体:

Go 复制代码
type counter struct {
    value int  // 私有字段,外部无法直接访问
}

创建新的计数器:

Go 复制代码
// 创建新的计数器
func New() *counter {
    return &counter{value: 0}
}

通过方法来操作数据:

Go 复制代码
// 只能通过方法操作数据
func (c *counter) Increment() {
    c.value++
}

func (c *counter) Decrement() {
    c.value--
}

func (c *counter) GetValue() int {
    return c.value
}

使用示例:

Go 复制代码
// 使用示例
func main() {
    c := counter.New()
    c.Increment()
    c.Increment()
    c.Decrement()
    fmt.Println(c.GetValue()) // 输出: 1
    // c.value = 100 // 错误!无法访问私有字段
}
相关推荐
吴声子夜歌2 小时前
ApacheCommons——commons-pool2(高性能通用对象池框架)
java·开发语言·apache
mldong7 小时前
C# 开发者也有自己的轻量工作流引擎了:NuGet 装包,5 分钟跑通一条审批流
后端·c#·.net
kruptos8 小时前
分布式系统怎么“选主“?Raft 共识一次讲清
开发语言·分布式·php·共识算法
吴声子夜歌8 小时前
ApacheCommons——commons-cli(命令行参数解析)
java·开发语言·apache
爱学堂IT分享9 小时前
鹤翔老师pmp项目管理培训认证考试课 (直播录播题库送学时证明)【共58课时】-51CTO学堂
后端
benchmark_cc9 小时前
REST API 和 Python SDK 应该怎么选?量化交易数据接口选型实战
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
王的宝库9 小时前
Go 项目结构:从单文件到标准工程布局
开发语言·后端·golang
Tairitsu_H9 小时前
[C++] 深入理解红黑树:封装set与map
开发语言·c++·set·map·红黑树·模拟实现
泡海椒9 小时前
JQuick-Curl 性能分析:并发场景下的性能表现与调优,第三方接口调用不只要快写也要稳跑
java·开发语言·okhttp
小智老师PMP10 小时前
2026深度解析|PMP第八版与NPDP核心侧重点本质区别(管理类证书怎么选)
开发语言·分布式·算法·职场和发展·产品经理