欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go語言常見錯誤之濫用getters/setters誤區(qū)實例探究

 更新時間:2024年01月07日 16:01:32   作者:云原生Go?源自開發(fā)者  
在Go語言編程中,恰如其分地使用getters和setters是至關(guān)重要的,過度和不適當(dāng)?shù)厥褂盟鼈兛赡軐?dǎo)致代碼冗余、可讀性差和封裝不當(dāng),在本文中,我們將深入探討如何識別濫用getter和setter的情況,以及如何采取最佳實踐來避免這些常見的Go錯誤

理解Go中的封裝

在開始之前,有必要了解Go語言中的封裝原則。在許多面向?qū)ο蟮恼Z言中,封裝通常通過使用私有字段(private)和公共方法(public)(即getters和setters)來實現(xiàn)。然而,在Go中,并沒有明確的“private”和“public”關(guān)鍵字,而是通過大寫字母開頭的標(biāo)識符來表達(dá)公有(可導(dǎo)出的)成員,小寫字母開頭的標(biāo)識符表示私有(非導(dǎo)出的)成員。

常見誤區(qū)

誤區(qū)一:為每個字段創(chuàng)建getter和setter

一個常見的錯誤是為結(jié)構(gòu)體中的每個字段都創(chuàng)建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中,如果字段不需要特殊的訪問控制,那么它們應(yīng)該被直接暴露,而不是通過getter和setter。

改進(jìn)后的例子:

type Person struct {
    Name string
}

誤區(qū)二:getter和setter中的不必要邏輯

避免在getter和setter中增加不必要的邏輯,因為這些額外的步驟可能不是調(diào)用者預(yù)期的。

例子:

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應(yīng)只返回值,setter應(yīng)只設(shè)置值。如果需要對數(shù)據(jù)進(jìn)行格式化或清理,請使用單獨的方法來明確這些意圖。

改進(jìn)后的例子:

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)
}

誤區(qū)三:setter方法返回值

在Go中,setter方法一般不應(yīng)該有返回值,因為這可能會導(dǎo)致混亂。

例子:

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

如何避免:

將setter方法設(shè)計為void函數(shù)。如果需要錯誤處理,可以考慮返回error類型。

改進(jìn)后的例子:

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

誤區(qū)四:違反Go語言的約定

在一些其他語言中,使用get和set前綴是普遍的命名約定。而在Go中,通常省略這些前綴,應(yīng)遵循Go的簡潔和直率的命名風(fēng)格。

例子:

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

如何避免:

簡化方法名,避開get和set前綴,除非它們增加了方法的清晰性。

改進(jìn)后的例子:

type Person struct {
    name string
    Age int
}

誤區(qū)五:在簡單轉(zhuǎn)發(fā)的getter/setter中添加鎖

在并發(fā)編程中,為了線程安全,可能會在getter和setter方法中添加鎖。然而,這有時候其實是一個過度設(shè)計。

例子:

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
}

如何避免:

如果結(jié)構(gòu)體是immutable的或者很少修改,那么簡單的讀寫可能不需要鎖。考慮結(jié)構(gòu)體的使用場景,只在確實需要的時候加鎖。

改進(jìn)后的例子:

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

總結(jié)

在Go中避免濫用getters和setters需要對Go的封裝原則有深入的理解。簡化你的API,保持方法直白,遵循Go的命名規(guī)范,這樣將讓你的代碼更加清晰和易于維護(hù)。

以上就是Go語言常見錯誤|之濫用getters/setters實例探究的詳細(xì)內(nèi)容,更多關(guān)于Go getters setters錯誤的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Go defer 原理和源碼剖析(推薦)

    Go defer 原理和源碼剖析(推薦)

    這篇文章主要介紹了Go defer 原理和源碼剖析,需要的朋友可以參考下
    2021-11-11
  • GO語言并發(fā)之好用的sync包詳解

    GO語言并發(fā)之好用的sync包詳解

    標(biāo)準(zhǔn)庫中的sync包在我們的日常開發(fā)中用的頗為廣泛,那么大家對sync包的用法知道多少呢,這篇文章就大致講一下sync包和它的使用,感興趣的可以學(xué)習(xí)一下
    2022-12-12
  • Go基礎(chǔ)語法的使用

    Go基礎(chǔ)語法的使用

    本文主要介紹了Go基礎(chǔ)語法的使用,包括標(biāo)識符、關(guān)鍵字、行分隔符、var關(guān)鍵字、:=運算符、空格、注釋、package、import、輸入輸出、運算符、條件控制、循環(huán)等,感興趣的可以了解一下
    2023-11-11
  • golang gin 框架 異步同步 goroutine 并發(fā)操作

    golang gin 框架 異步同步 goroutine 并發(fā)操作

    這篇文章主要介紹了golang gin 框架 異步同步 goroutine 并發(fā)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • vscode搭建go開發(fā)環(huán)境案例詳解

    vscode搭建go開發(fā)環(huán)境案例詳解

    對于Visual Studio Code開發(fā)工具,有一款優(yōu)秀的GoLang插件,今天通過本文給大家介紹下vscode搭建go開發(fā)環(huán)境的詳細(xì)教程,感興趣的朋友跟隨小編一起看看吧
    2021-12-12
  • Golang實現(xiàn)按行讀取文件的方法小結(jié)

    Golang實現(xiàn)按行讀取文件的方法小結(jié)

    按行讀取文件相較于一次性載入,有著很多優(yōu)勢,如內(nèi)存效率高、處理速度快、實時性高等,本文主要介紹了Golang按行讀取文件的相關(guān)方法,希望對大家有所幫助
    2024-02-02
  • Golang中使用Swagger生成API文檔的流程步驟

    Golang中使用Swagger生成API文檔的流程步驟

    Swagger 是一款強(qiáng)大的 API 文檔生成工具,可以幫助開發(fā)者輕松創(chuàng)建、管理和展示 RESTful API 文檔,在本文中,我們將介紹如何在 Golang 項目中使用 Swagger 來生成 API 文檔,文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下
    2024-07-07
  • 詳解Golang利用反射reflect動態(tài)調(diào)用方法

    詳解Golang利用反射reflect動態(tài)調(diào)用方法

    這篇文章主要介紹了詳解Golang利用反射reflect動態(tài)調(diào)用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • 從源碼深入理解golang?RWMutex讀寫鎖操作

    從源碼深入理解golang?RWMutex讀寫鎖操作

    這篇文章主要介紹了從源碼深入理解golang?RWMutex讀寫鎖操作,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-05-05
  • Go語言中database/sql的用法介紹

    Go語言中database/sql的用法介紹

    Go語言中的database/sql包定義了對數(shù)據(jù)庫的一系列操作,database/sql/driver包定義了應(yīng)被數(shù)據(jù)庫驅(qū)動實現(xiàn)的接口,這些接口會被sql包使用,本文將詳細(xì)給大家介紹Go的database/sql的使用方法,需要的朋友可以參考下
    2023-05-05

最新評論