Go语言常见错误之滥用getters/setters误区实例探究

 更新时间:2024年01月07日 16:01:32   作者:云原生Go 源自开发者  
在Go语言编程中,恰如其分地使用getters和setters是至关重要的,过度和不适当地使用它们可能导致代码冗余、可读性差和封装不当,在本文中,我们将深入探讨如何识别滥用getter和setter的情况,以及如何采取最佳实践来避免这些常见的Go错误

理解Go中的封装

在开始之前,有必要了解Go语言中的封装原则。在许多面向对象的语言中,封装通常通过使用私有字段(private)和公共方法(public)(即getters和setters)来实现。然而,在Go中,并没有明确的“private”和“public”关键字,而是通过大写字母开头的标识符来表达公有(可导出的)成员,小写字母开头的标识符表示私有(非导出的)成员。

常见误区

误区一:为每个字段创建getter和setter

一个常见的错误是为结构体中的每个字段都创建getter和setter方法,即使它们不需要特殊逻辑来访问或修改。

例子:

type Person struct {
    name string
}
func (p *Person) GetName() string {
    return p.name
}
func (p *Person) SetName(name string) {
    p.name = name
}

如何避免:

在Go中,如果字段不需要特殊的访问控制,那么它们应该被直接暴露,而不是通过getter和setter。

改进后的例子:

type Person struct {
    Name string
}

误区二:getter和setter中的不必要逻辑

避免在getter和setter中增加不必要的逻辑,因为这些额外的步骤可能不是调用者预期的。

例子:

func (p *Person) GetName() string {
    return "Name: " + p.name // Unnecessary formatting
}

func (p *Person) SetName(name string) {
    p.name = strings.TrimSpace(name) // Unnecessary trimming
}

如何避免:

Getter应只返回值,setter应只设置值。如果需要对数据进行格式化或清理,请使用单独的方法来明确这些意图。

改进后的例子:

type Person struct {
    Name string
}
func (p *Person) SetName(name string) {
    p.Name = name
}
func (p *Person) FormattedName() string {
    return "Name: " + p.Name
}
func (p *Person) CleanName() {
    p.Name = strings.TrimSpace(p.Name)
}

误区三:setter方法返回值

在Go中,setter方法一般不应该有返回值,因为这可能会导致混乱。

例子:

func (p *Person) SetName(name string) bool {
    if name == "" {
        return false
    }
    p.name = name
    return true
}

如何避免:

将setter方法设计为void函数。如果需要错误处理,可以考虑返回error类型。

改进后的例子:

func (p *Person) SetName(name string) error {
    if name == "" {
        return errors.New("name cannot be empty")
    }
    p.Name = name
    return nil
}

误区四:违反Go语言的约定

在一些其他语言中,使用get和set前缀是普遍的命名约定。而在Go中,通常省略这些前缀,应遵循Go的简洁和直率的命名风格。

例子:

func (p *Person) GetAge() int {
    return p.age
}
func (p *Person) SetAge(age int) {
    p.age = age
}

如何避免:

简化方法名,避开get和set前缀,除非它们增加了方法的清晰性。

改进后的例子:

type Person struct {
    name string
    Age int
}

误区五:在简单转发的getter/setter中添加锁

在并发编程中,为了线程安全,可能会在getter和setter方法中添加锁。然而,这有时候其实是一个过度设计。

例子:

type ThreadSafePerson struct {
    name string
    mu sync.Mutex
}
func (p *ThreadSafePerson) GetName() string {
    p.mu.Lock()
    defer p.mu.Unlock()
    return p.name
}
func (p *ThreadSafePerson) SetName(name string) {
    p.mu.Lock()
    defer p.mu.Unlock()
    p.name = name
}

如何避免:

如果结构体是immutable的或者很少修改,那么简单的读写可能不需要锁。考虑结构体的使用场景,只在确实需要的时候加锁。

改进后的例子:

type ThreadSafePerson struct {
    Name string // Assume atomic or rarely changed fields
}

总结

在Go中避免滥用getters和setters需要对Go的封装原则有深入的理解。简化你的API,保持方法直白,遵循Go的命名规范,这样将让你的代码更加清晰和易于维护。

以上就是Go语言常见错误|之滥用getters/setters实例探究的详细内容,更多关于Go getters setters错误的资料请关注脚本之家其它相关文章!

相关文章

  • Golang 1.18新特性模糊测试用法详解

    Golang 1.18新特性模糊测试用法详解

    模糊测试是一种软件测试技术。其核心思想是將自动或半自动生成的随机数据输入到一个程序中,并监视程序异常,如崩溃,断言失败,以发现可能的程序错误,比如内存泄漏,本文给大家介绍了Golang 1.18 新特性模糊测试,感兴趣的同学可以参考阅读下
    2023-05-05
  • 利用Golang实现TCP连接的双向拷贝详解

    利用Golang实现TCP连接的双向拷贝详解

    公司中遇到了一个使用golang编写的agent程序,所以这篇文章主要给大家介绍了关于利用Go如何实现TCP连接的双向拷贝的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考,下面随着小编来一起看看吧。
    2017-09-09
  • golang端口占用检测的使用

    golang端口占用检测的使用

    这篇文章主要介绍了golang端口占用检测的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • gorm FirstOrCreate和受影响的行数实例

    gorm FirstOrCreate和受影响的行数实例

    这篇文章主要介绍了gorm FirstOrCreate和受影响的行数实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Go代码检查的推荐工具及使用详解

    Go代码检查的推荐工具及使用详解

    这篇文章主要为大家介绍了Go代码检查的推荐工具及使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • Go语言常用字符串处理方法实例汇总

    Go语言常用字符串处理方法实例汇总

    这篇文章主要介绍了Go语言常用字符串处理方法,实例汇总了Go语言中常见的各种字符串处理技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • go doudou开发gRPC服务快速上手实现详解

    go doudou开发gRPC服务快速上手实现详解

    这篇文章主要为大家介绍了go doudou开发gRPC服务快速上手实现过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • golang生成JSON以及解析JSON

    golang生成JSON以及解析JSON

    这篇文章主要介绍了golang生成JSON以及解析JSON,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • 详解go程序如何在windows服务中开启和关闭

    详解go程序如何在windows服务中开启和关闭

    这篇文章主要介绍了一个go程序,如何在windows服务中优雅开启和关闭,文中通过代码示例和图文讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-07-07
  • 深入理解Go高级并发模式编写更高效可扩展的应用程序

    深入理解Go高级并发模式编写更高效可扩展的应用程序

    Go对并发提供了强大的原生支持,本文讨论Go的高级并发模式,理解这些并发模式,可以帮助我们编写高效的Go应用程序,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-02-02

最新评论