在 Go 中如何实现封装?

主要观点:讨论了如何创建一个必须为公共的简单结构体Address,同时要能将 JSON/YAML 数据编组/解组到其中,而又要使其不可变。给出了几种做法及讨论。
关键信息:

  • 原始的Address结构体字段为公共的,导致对象可变。
  • 有人使用type Address struct { _Address struct { Street string; City string; ZipCode int } }并编写Street(), City(), ZipCode()获取器,但认为这绕开语言太多。
  • 有人认为可将字段设为私有并手动实现编组。
  • 对于需要 JSON 可编组/解组的“外部”AddressExt结构体,字段需导出且可变。对于“内部”AddressInt结构体,字段应未导出且不可变,需有函数将“外部”地址值映射到“内部”地址类型。
    重要细节:
  • 给出了https://go.dev/play/p/Ns1SDE_PRko作为手动编组的工作示例。
  • 强调了不同做法的优缺点和适用性,不同人有不同看法和做法。
阅读 7
0 条评论