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错误的资料请关注脚本之家其它相关文章!

相关文章

  • Go defer 原理和源码剖析(推荐)

    Go defer 原理和源码剖析(推荐)

    这篇文章主要介绍了Go defer 原理和源码剖析,需要的朋友可以参考下
    2021-11-11
  • GO语言并发之好用的sync包详解

    GO语言并发之好用的sync包详解

    标准库中的sync包在我们的日常开发中用的颇为广泛,那么大家对sync包的用法知道多少呢,这篇文章就大致讲一下sync包和它的使用,感兴趣的可以学习一下
    2022-12-12
  • Go基础语法的使用

    Go基础语法的使用

    本文主要介绍了Go基础语法的使用,包括标识符、关键字、行分隔符、var关键字、:=运算符、空格、注释、package、import、输入输出、运算符、条件控制、循环等,感兴趣的可以了解一下
    2023-11-11
  • golang gin 框架 异步同步 goroutine 并发操作

    golang gin 框架 异步同步 goroutine 并发操作

    这篇文章主要介绍了golang gin 框架 异步同步 goroutine 并发操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • vscode搭建go开发环境案例详解

    vscode搭建go开发环境案例详解

    对于Visual Studio Code开发工具,有一款优秀的GoLang插件,今天通过本文给大家介绍下vscode搭建go开发环境的详细教程,感兴趣的朋友跟随小编一起看看吧
    2021-12-12
  • Golang实现按行读取文件的方法小结

    Golang实现按行读取文件的方法小结

    按行读取文件相较于一次性载入,有着很多优势,如内存效率高、处理速度快、实时性高等,本文主要介绍了Golang按行读取文件的相关方法,希望对大家有所帮助
    2024-02-02
  • Golang中使用Swagger生成API文档的流程步骤

    Golang中使用Swagger生成API文档的流程步骤

    Swagger 是一款强大的 API 文档生成工具,可以帮助开发者轻松创建、管理和展示 RESTful API 文档,在本文中,我们将介绍如何在 Golang 项目中使用 Swagger 来生成 API 文档,文中有相关的代码示例供大家参考,需要的朋友可以参考下
    2024-07-07
  • 详解Golang利用反射reflect动态调用方法

    详解Golang利用反射reflect动态调用方法

    这篇文章主要介绍了详解Golang利用反射reflect动态调用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-11-11
  • 从源码深入理解golang RWMutex读写锁操作

    从源码深入理解golang RWMutex读写锁操作

    这篇文章主要介绍了从源码深入理解golang RWMutex读写锁操作,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • Go语言中database/sql的用法介绍

    Go语言中database/sql的用法介绍

    Go语言中的database/sql包定义了对数据库的一系列操作,database/sql/driver包定义了应被数据库驱动实现的接口,这些接口会被sql包使用,本文将详细给大家介绍Go的database/sql的使用方法,需要的朋友可以参考下
    2023-05-05

最新评论