我更喜欢传递结构体指针的两个原因

主要观点:在 Go 语言中,对于结构体值的传递,常见争议是通过指针还是复制值。通常应更注重代码的易维护性和可扩展性,而非过度追求性能,选择使用指针结构体的两个主要原因是“标识”和“一致性”。
关键信息:

  • 现实中软件工程更注重代码的易读性和可修改性,而非仅让计算机满意,语言提供的每种特性都有其权衡。
  • 对于结构体传递方式的选择不能仅基于具体情况,而应根据语义决定,前期确定后在项目期间通常保持不变。
  • time.Time为例,其为值对象,适合使用值复制语义,因为其值的标识由属性的相等性决定,空值有意义。
  • 对于实体类型,其标识不由属性决定,可能需要使用指针来确保不同副本指向同一源,如项目管理系统中的ProjectPerson类型。
    重要细节:
  • 讨论是否使用某种 Go 结构的内容很快变得过于技术化,对于大多数人来说,不必过度担心 Go 应用的性能,而应注重代码的可维护性。
  • 确定指针和值复制语义的界限时,部分受领域驱动设计(DDD)启发,部分参考Ardan Labs 帖子
  • 在处理Project类型时,仅使用值复制语义可能导致多个相同属性的项目被视为相等,而添加唯一 ID 也可能存在问题,使用指针语义可更好地确定项目的标识。
  • 最后呼吁读者理解指针的价值,不要过度担心改变语义的代价,注重代码的一致性和合理性。同时推荐了其他相关有趣的文章。
阅读 105
0 条评论