Go语言中如何正确使用getter和setter

        在编程中,数据封装指的是隐藏对象的值或状态。getter和setter是通过在不可导出的对象字段基础上提供可导出方法来启用封装的。

        在Go中,并不像我们在某些语言中看到的那样,自动支持getter和setter。使用getter和setter来访问结构体字段也被认为既不是强制性的,也不是惯用的。例如,标准库实现了可以直接访问某些字段(例如time.Time)的结构体。time.Time结构体如下:

timer := time.NewTimer(time.Second)
<-timer.C    //C是一个<-chan Time字段

        尽管不建议这样做,但我们甚至可以直接修改C。然而,这个例子说明了标准Go库并不强制使用getter和/或setter,即使我们不应该修改一个字段。

另一方面,使用getter和setter具有一些优点,包括:

  • 它们封装了与获取或设置字段相关的行为,允许稍后添加新功能(例如,验证字段、返回计算值或用互斥锁封装对字段的访问)
  • 它们隐藏了内部实现,使我们在暴露内容时可更灵活地操作
  • 当属性在运行时发生更改时,它们提供了一个调试拦截点,使调试变得更容易

        如果遇到这种情况,或者当我们保证向前兼容的时候预见一个可能的情况,那么使用getter和setter可以带来一些好处。例如,如果将它们与一个名为balance的字段一起使用,我们应该遵循以下命名约定:

  • getter方法应该被命名为Balance
  • setter方法应该被命名为SetBalance

这里有一个例子:

currentBalance := customer.Balance()    //Getter
if currentBalance < 0 {
    customer.SetBalance(0)    //Setter
}

        总之,如果结构体上的getter和setter没有任何价值,我们就不应该用它们淹没代码。我们应该实事求理,努力在效率和遵循在其他编程范例中有时被认为是无可争议的习惯用法之间找到正确的平衡。

        记住,Go是一种独特的语言,在设计上有许多特点,包括简单性。然而,如果我们发现需要getter和setter,那么使用它们并没有什么问题。

相关推荐

  1. Go语言如何正确使用gettersetter

    2024-04-05 04:02:02       43 阅读
  2. Kotlin getter setter

    2024-04-05 04:02:02       29 阅读
  3. gettersetter方法的优缺点

    2024-04-05 04:02:02       30 阅读
  4. Go语言如何使用变量

    2024-04-05 04:02:02       27 阅读
  5. 正确处理Go语言的瞬时资源

    2024-04-05 04:02:02       38 阅读
  6. 如何正确使用reflect:Go反射规范与最佳实践

    2024-04-05 04:02:02       34 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-05 04:02:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-05 04:02:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-05 04:02:02       82 阅读
  4. Python语言-面向对象

    2024-04-05 04:02:02       91 阅读

热门阅读

  1. LeetCode //C - 981. Time Based Key-Value Store

    2024-04-05 04:02:02       34 阅读
  2. 【无标题】html中使用div标签的坏处

    2024-04-05 04:02:02       36 阅读
  3. 【积累】mysql

    2024-04-05 04:02:02       41 阅读
  4. mysql常见故障

    2024-04-05 04:02:02       37 阅读
  5. 4.2总结

    4.2总结

    2024-04-05 04:02:02      41 阅读
  6. 【leetcode面试经典150题】10.跳跃游戏 II(C++)

    2024-04-05 04:02:02       41 阅读
  7. 搭建本地YUM仓库

    2024-04-05 04:02:02       42 阅读
  8. C# OpenFileDialog

    2024-04-05 04:02:02       39 阅读
  9. 时间复杂度和空间复杂度

    2024-04-05 04:02:02       37 阅读
  10. Linux系统NVME SSD上下电流程梳理

    2024-04-05 04:02:02       37 阅读
  11. 如何成为一名独立开发者

    2024-04-05 04:02:02       43 阅读
  12. rust 自定义安装 error: linker `link.exe` not found

    2024-04-05 04:02:02       38 阅读
  13. 两种C链表接口构造方式

    2024-04-05 04:02:02       38 阅读
  14. 五、c++代码中的安全风险-memcpy

    2024-04-05 04:02:02       35 阅读