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拾遗之实现一个不可复制类型详解

    Golang拾遗之实现一个不可复制类型详解

    在这篇文章中我们将实现一个无法被复制的类型,顺便加深对引用类型、值传递以及指针的理解。文中的示例代码讲解详细,感兴趣的可以了解一下
    2023-02-02
  • golang移除数组中重复的元素操作

    golang移除数组中重复的元素操作

    这篇文章主要介绍了golang移除数组中重复的元素操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 以alpine作为基础镜像构建Golang可执行程序操作

    以alpine作为基础镜像构建Golang可执行程序操作

    这篇文章主要介绍了以alpine作为基础镜像构建Golang可执行程序操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Go简单实现协程池的实现示例

    Go简单实现协程池的实现示例

    本文主要介绍了Go简单实现协程池的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • 使用Golang快速构建出命令行应用程序

    使用Golang快速构建出命令行应用程序

    在日常开发中,大家对命令行工具(CLI)想必特别熟悉了,如果说你不知道命令工具,那你可能是个假开发。每天都会使用大量的命令行工具,例如最常用的Git、Go、Docker等,这篇文章主要介绍了使用Golang快速构建出命令行应用程序,需要的朋友可以参考下
    2023-02-02
  • go语言里包的用法实例

    go语言里包的用法实例

    这篇文章主要介绍了go语言里包的用法,实例分析了Go语言里包的原理与使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • Golang reflect反射的使用实例

    Golang reflect反射的使用实例

    Golang反射的错误大多数都来自于调用了一个不适合当前类型的方法,而且,这些错误通常是在运行时才会暴露出来,而不是在编译时,如果我们传递的类型在反射代码中没有被覆盖到那么很容易就会panic,本文就介绍一下使用go反射时很大概率会出现的错误,需要的可以参考一下
    2023-04-04
  • Go语言基础之网络编程全面教程示例

    Go语言基础之网络编程全面教程示例

    这篇文章主要为大家介绍了Go语言基础之网络编程全面教程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • 深入了解Go语言的基本语法与常用函数

    深入了解Go语言的基本语法与常用函数

    这篇文章主要为大家详细介绍一下Go语言中的基本语法与常用函数,文中的示例代码讲解详细,对我们学习Go语言有一定的帮助,需要的可以参考一下
    2022-07-07
  • golang Iris运行多个应用的实现

    golang Iris运行多个应用的实现

    本文主要介绍了golang Iris运行多个应用的实现,在Iris里面,提供了一种方式可以让我们同时运行多个应用,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01

最新评论