当前位置: 首页 > news >正文

Go结构体与指针【2】接收者应该怎么用

我看很多地方都鼓励使用结构体接收者呀,为什么这里不使用呢

这是一个非常好的观察。Go 确实鼓励使用结构体接收者(Method),但“什么时候用”取决于你把这个方法看作是“对象的行为”还是“对象的构造”。

在配置加载这个场景下,不建议使用接收者(尤其是指针接收者)主要有以下三个原因:

1. “先有鸡还是先有蛋”的悖论

在你原本的代码中:

func (r *RedisConfig) Load() RedisConfig { ... }

这是一个指针接收者。这意味着在调用Load之前,你必须已经有一个RedisConfig的实例(哪怕是空值)。

  • 语义矛盾:Load的目的是为了“创建”或“填充”配置。如果我已经有一个对象了,再去调用它的方法返回一个新对象,这在逻辑上显得多余。
  • 写法繁杂: 导致你必须写成redis := RedisConfig{}; conf = redis.Load(),多了一步无意义的实例化。

2. 区分“行为”与“工厂”

Go 的惯例是:

  • 工厂函数(New/Load): 如果目的是从无到有创建一个结构体,应该使用普通的函数(通常叫New...Load...)。
    • 例子:sql.Open(),http.NewRequest()
  • 方法(Method): 如果目的是对已经存在的数据进行操作或获取信息,才使用接收者。
    • 例子:conf.GetAddr()db.Query()

3. 指针接收者的陷阱

你原来的Load方法使用的是(r *RedisConfig),但在方法体内部,你完全没有用到r(没有r.Host = ...),而是直接返回了一个新的结构体。

  • 这违反了指针接收者的初衷:指针接收者通常是为了修改原对象的值。
  • 如果你想用接收者且不打算修改原对象,应该用值接收者(r RedisConfig)。但回到第一点,对于初始化逻辑,函数依然比方法更直接。

什么时候该用结构体接收者?

如果你希望配置具有“行为”,比如校验配置是否合法,这时候用接收者就非常完美:

// 这是一个“行为”,校验已加载的数据,用接收者很合适 func (r *RedisConfig) Validate() error { if r.Port == 0 { return errors.New("redis port cannot be zero") } return nil } // 使用场景 cfg := config.LoadRedisConfig() // 函数负责创建 if err := cfg.Validate(); err != nil { // 方法负责校验行为 log.Fatal(err) }

总结建议

对于你的项目结构:

  1. 创建/加载: 用LoadRedisConfig() RedisConfig(普通函数)。
  2. 获取属性/处理逻辑: 用(c *Config) GetServerAddr() string(接收者方法)。

这样做你的Config包会非常清晰:函数负责“生孩子”,方法负责“教孩子干活”。

http://www.jsqmd.com/news/725844/

相关文章:

  • 终极指南:如何快速掌握Firefox Reality沉浸式VR浏览器开发
  • 2026年乌鲁木齐隐形车衣施工全攻略:晶华Ginnva车衣+车闪电连锁深度评测与官方联系指南 - 企业名录优选推荐
  • XAPK转APK实战手册:90秒搞定Android应用安装难题
  • 2026年5月劳力士中国区售后服务网络优化升级(最新电话及地址)【亲历踩坑实录诚信记录】 - 亨得利官方服务中心
  • 武汉市精诚洁环保:新洲专业水箱保洁怎么联系 - LYL仔仔
  • Python调用Taotoken聚合大模型API快速处理表格数据匹配任务
  • 2026年5月浪琴中国区售后服务网络优化升级(最新电话及地址)【老司机分享横评从零搭建】 - 亨得利官方服务中心
  • 2026年亲测:空调制冷效果变差,是不是需要加冷媒? - 小何家电维修
  • 从手机快充到笔记本供电:拆解USB PD控制消息在实际产品中的工作流
  • 成都及四川门窗玻璃定制怎么选?资深企业实力解析 - 深度智识库
  • 从30秒到3小时,一次工具迭代引发的产业思考 - 行业产品测评专家
  • AF 系列荧光染料:高亮度・稳信号・全光谱覆盖
  • 2026年新疆隐形车衣市场全攻略:晶华Ginnva正品施工与避坑指南 - 企业名录优选推荐
  • 从LeetCode LRU到CMU15-445 Project#1:手把手教你用C++实现LRU-K缓存替换策略
  • 2026年5月天梭中国区售后服务网络优化升级(最新电话及地址)【排雷亲测诚信记录】 - 亨得利官方服务中心
  • 四川青少年素质学校评测:核心维度对比实力机构 - 奔跑123
  • 2026 岳阳黄金回收榜|福正美黄金回收金榜题名 - 福正美黄金回收
  • 工商业地坪常见施工痛点与江苏本地十大合规地坪服务商梳理 - 新闻观察者
  • 电子工业秤COM串口软件相关点
  • 必背 Linux Shell 常用命令(表格版) | Linux Shell 高频必敲命令(纯手打背诵版)
  • 武汉市精诚洁环保:黄陂大型管网吸污选哪家 - LYL仔仔
  • 2026年乌鲁木齐隐形车衣市场深度横评:晶华Ginnva、龙膜、威固、极膜、量子膜五大品牌选购指南 - 企业名录优选推荐
  • 保姆级教程:在Ubuntu 18.04上为AM40盒子编译和替换Firefly RK3399的DTB文件
  • 告别黑盒:手把手拆解Stable Diffusion的Diffusers Pipeline,从VAE到U-Net的每一步
  • 2026年初中高中学习机推荐榜单与选购指南 - 博客万
  • 阿里云盘Refresh Token终极指南:5分钟扫码获取完整教程
  • Python RoboClaw库:机器人电机控制与串口通信实战指南
  • 2026年5月积家中国区售后服务网络优化升级(最新电话及地址)【权威评测血泪教训数据验证】 - 亨得利官方服务中心
  • 2026年武汉网络推广与短视频代运营深度横评:全面对比指南 - 年度推荐企业名录
  • 2026上海用友代理商选哪家?实力机构推荐 - 品牌排行榜