如何通过Go值类型构建不可变对象_Go Value不可变设计说明


Go通过值类型语义、私有字段封装、只读方法和副本返回实现逻辑不可变性:结构体字段小写,提供New构造函数和getter,更新返回新实例;切片/map需深拷贝防篡改;接口限定只读操作。

如何通过go值类型构建不可变对象_go value不可变设计说明

Go 语言本身没有内置的“不可变对象”关键字或语法,但可以通过值类型(value type)的语义特性 + 封装 + 约束访问,实现逻辑上的不可变性。关键不在于禁止修改,而在于让外部无法直接修改内部状态。

用结构体+私有字段+只读方法模拟不可变

定义一个结构体,所有字段小写(未导出),不提供 setter 方法,只提供构造函数和只读访问器:

  • 结构体字段全部小写,外部包无法直接访问或修改
  • 提供导出的 NewXXX 函数返回值(不是指针),确保每次使用都是副本
  • 只提供 getter 方法(如 Name()、Count()),不提供 SetXXX
  • 若需“更新”,返回一个新实例(函数式风格),原值不受影响
示例:
type Person struct {
    name  string
    age   int
}

func NewPerson(name string, age int) Person {
    return Person{name: name, age: age}
}

func (p Person) Name() string { return p.name }
func (p Person) Age() int    { return p.age }

// “更新”操作返回新值,不改变原值
func (p Person) WithAge(newAge int) Person {
    return Person{name: p.name, age: newAge}
}

避免暴露可变内部(如切片、map、指针)

即使结构体字段私有,若包含切片、map 或指针,外部仍可能通过返回的引用间接修改内部状态:

  • 切片:不要直接返回字段切片,应返回副本(如 append([]T(nil), s...)
  • map:不要返回 map 值本身,可提供迭代方法或深拷贝后的副本
  • 指针/结构体嵌套:内部字段若为指针,需确保其指向的数据也不可被外部篡改
安全写法示例:
type Config struct {
    tags []string // 私有切片
}

func (c Config) Tags() []string {
    // 返回副本,防止外部修改原切片
    return append([]string(nil), c.tags...)
}

func (c Config) WithTag(t string) Config {
    return Config{tags: append(c.tags, t)}
}

利用值语义天然隔离修改

Go 的值类型(struct、array、basic types)在赋值、传参、返回时自动复制,这是构建不可变性的底层保障:

Prisma Prisma

Prisma是一款照片编辑工具,用户可以轻松地将照片转换成数字艺术。

Prisma 92 查看详情 Prisma
  • 接收者用值类型(func (p Person) ...),方法内对 p 的修改不影响调用方原始值
  • 函数参数传入结构体而非 *Person,避免意外共享状态
  • 返回结构体而非指针,明确表达“结果是新值”

配合接口进一步隐藏实现细节

定义只读接口,只暴露 getter 和衍生操作,不暴露构造或修改能力:

type ReadOnlyPerson interface {
    Name() string
    Age() int
    IsAdult() bool
}

// 实现由私有结构体承担,外部只能按接口使用
func (p Person) IsAdult() bool { return p.age >= 18 }
  • 接口变量无法强制转回具体类型(除非类型断言),限制了越权操作可能
  • 包内可继续扩展功能,对外接口保持稳定且只读

基本上就这些。Go 的不可变不是靠编译器强制,而是靠设计约定 + 值类型复制 + 封装控制。不复杂但容易忽略细节,尤其切片和 map 的引用陷阱。

以上就是如何通过Go值类型构建不可变对象_Go Value不可变设计说明的详细内容,更多请关注其它相关文章!


# app  # go  # 相关文章  # 原值  # 这是  # 都是  # 不同类型  # 只提供  # 而非  # 布尔  # asic  # 昆明做网站建设的过程  # 网站优化绿松石戒指店铺  # 临沂提供网站优化开户  # 佛山seo网络营销平台  # 2023网站推广入口b站  # 网站全面建设是什么工作  # 网站优化应该怎样做好呢  # 寿光营销推广费用多少钱  # 三网站推广  # 福清网站推广  # 不受  # 可以通过 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 快递优选如何查优选物流_快递优选专属物流渠道查询与配送时效  excel怎么制作考勤表 excel考勤模板与函数公式讲解  三角洲行动2025年9月10日摩斯密码分享  在Peewee中处理PostgreSQL记录重复:一站式数据摄取教程  steam缓存文件在哪儿_steam缓存文件的路径查找方法与结构说明  J*a中为什么强调组合优于继承_组合模式带来的灵活性与可维护性解析  《王者荣耀世界》英雄获取攻略  WooCommerce 购物车:始终显示所有交叉销售商品  mysql中如何配置字符集和排序规则_mysql字符集排序配置  《深林》冬季章节图文攻略  抖音火山版注销账号抖音会注销吗 抖音火山版与抖音账号注销关系  PHP中实现JSON数据数组分页的教程  PHP安全加载非公开目录图片与动态内容类型处理指南  C++ priority_queue怎么用_C++优先队列底层实现与自定义比较器  QQ邮箱手机版网页版 QQ邮箱登录入口地址  百度浏览器无法安装扩展程序_百度浏览器插件安装失败原因解析  使用VS Code作为你的个人知识管理系统  微信客户端怎么查看二维码_微信客户端个人二维码查看方法  汽水音乐车机版官网5.0 汽水音乐车机版5.0版本下载入口  windows10怎么开启卓越性能_windows10电源选项代码激活  VS Code如何设置默认配置  从J*a应用程序中导出MySQL表数据的技术指南  手机坏了微信聊天记录怎么导出来 新手机恢复聊天记录技巧  PPT页面尺寸怎么修改 PPT自定义幻灯片大小与方向设置【教程】  Coolpad5890 ROM刷机包  如何查询个人病历记录  汽水音乐在线听歌网页版 汽水音乐在线听歌网页版入口  Win10运行窗口在哪里打开 Win10调出运行命令框快捷键【技巧】  《气泡星球》兑换码礼包大全  Golang如何使用gRPC拦截器实现日志收集_Golang gRPC拦截器日志收集实践  Chart.js 教程:自定义插件实现图表与图例间距调整  铁路12306入口 铁路12306官网版入口登录网址  中大网校app做题记录清除方法  《健康大兴》注册方法介绍  背部总是隐隐作痛怎么回事 背痛如何改善  漫蛙manwa2网页版书签同步链接_漫蛙manwa多设备登录入口  Excel如何制作月度销售统计图_Excel动态图表制作与控件应用  12306不能订票的时间段是固定的吗? | 节假日购票时间有无变化  lol小红书怎么|直播|?lol小红书|直播|是什么意思?  抖音商城官网是什么_抖音商城官方网址与访问方法  《律学法考》查看学习数据方法  苹果手机手电筒无法开启  c++类和对象到底是什么_c++面向对象编程基础  windows10怎么开启wsl_windows10安装linux子系统教程  解决 Vue 3 组件未定义错误:理解 createApp 与根组件的正确使用  diskgenius分区工具如何设置Bios启动项  《偃武》甘宁技能详解  LINUX怎么查看显卡信息_LINUX查看GPU状态  cad怎么隐藏指定的图层_cad隐藏或冻结图层方法  J*a中逻辑运算符如何使用_逻辑与或非的基础用法讲解 

 2025-12-20

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.