Go語(yǔ)言常見(jiàn)錯(cuò)誤之濫用getters/setters誤區(qū)實(shí)例探究
理解Go中的封裝
在開(kāi)始之前,有必要了解Go語(yǔ)言中的封裝原則。在許多面向?qū)ο蟮恼Z(yǔ)言中,封裝通常通過(guò)使用私有字段(private)和公共方法(public)(即getters和setters)來(lái)實(shí)現(xiàn)。然而,在Go中,并沒(méi)有明確的“private”和“public”關(guān)鍵字,而是通過(guò)大寫(xiě)字母開(kāi)頭的標(biāo)識(shí)符來(lái)表達(dá)公有(可導(dǎo)出的)成員,小寫(xiě)字母開(kāi)頭的標(biāo)識(shí)符表示私有(非導(dǎo)出的)成員。
常見(jiàn)誤區(qū)
誤區(qū)一:為每個(gè)字段創(chuàng)建getter和setter
一個(gè)常見(jiàn)的錯(cuò)誤是為結(jié)構(gòu)體中的每個(gè)字段都創(chuàng)建getter和setter方法,即使它們不需要特殊邏輯來(lái)訪問(wèn)或修改。
例子:
type Person struct {
name string
}
func (p *Person) GetName() string {
return p.name
}
func (p *Person) SetName(name string) {
p.name = name
}如何避免:
在Go中,如果字段不需要特殊的訪問(wèn)控制,那么它們應(yīng)該被直接暴露,而不是通過(guò)getter和setter。
改進(jìn)后的例子:
type Person struct {
Name string
}
誤區(qū)二:getter和setter中的不必要邏輯
避免在getter和setter中增加不必要的邏輯,因?yàn)檫@些額外的步驟可能不是調(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è)置值。如果需要對(duì)數(shù)據(jù)進(jìn)行格式化或清理,請(qǐng)使用單獨(dú)的方法來(lái)明確這些意圖。
改進(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)該有返回值,因?yàn)檫@可能會(huì)導(dǎo)致混亂。
例子:
func (p *Person) SetName(name string) bool {
if name == "" {
return false
}
p.name = name
return true
}
如何避免:
將setter方法設(shè)計(jì)為void函數(shù)。如果需要錯(cuò)誤處理,可以考慮返回error類(lèi)型。
改進(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語(yǔ)言的約定
在一些其他語(yǔ)言中,使用get和set前綴是普遍的命名約定。而在Go中,通常省略這些前綴,應(yīng)遵循Go的簡(jiǎn)潔和直率的命名風(fēng)格。
例子:
func (p *Person) GetAge() int {
return p.age
}
func (p *Person) SetAge(age int) {
p.age = age
}如何避免:
簡(jiǎn)化方法名,避開(kāi)get和set前綴,除非它們?cè)黾恿朔椒ǖ那逦浴?/p>
改進(jìn)后的例子:
type Person struct {
name string
Age int
}
誤區(qū)五:在簡(jiǎn)單轉(zhuǎn)發(fā)的getter/setter中添加鎖
在并發(fā)編程中,為了線程安全,可能會(huì)在getter和setter方法中添加鎖。然而,這有時(shí)候其實(shí)是一個(gè)過(guò)度設(shè)計(jì)。
例子:
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ǎn)單的讀寫(xiě)可能不需要鎖??紤]結(jié)構(gòu)體的使用場(chǎng)景,只在確實(shí)需要的時(shí)候加鎖。
改進(jìn)后的例子:
type ThreadSafePerson struct {
Name string // Assume atomic or rarely changed fields
}
總結(jié)
在Go中避免濫用getters和setters需要對(duì)Go的封裝原則有深入的理解。簡(jiǎn)化你的API,保持方法直白,遵循Go的命名規(guī)范,這樣將讓你的代碼更加清晰和易于維護(hù)。
以上就是Go語(yǔ)言常見(jiàn)錯(cuò)誤|之濫用getters/setters實(shí)例探究的詳細(xì)內(nèi)容,更多關(guān)于Go getters setters錯(cuò)誤的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- go高并發(fā)時(shí)append方法偶現(xiàn)錯(cuò)誤解決分析
- 詳解Go多協(xié)程并發(fā)環(huán)境下的錯(cuò)誤處理
- Golang錯(cuò)誤處理:異常捕捉和恢復(fù)機(jī)制
- Go語(yǔ)言常見(jiàn)錯(cuò)誤之a(chǎn)ny沒(méi)傳遞任何信息解決分析
- Go語(yǔ)言常見(jiàn)錯(cuò)誤之將接口定義在實(shí)現(xiàn)方
- Go語(yǔ)言常見(jiàn)錯(cuò)誤之誤用init函數(shù)實(shí)例解析
- Go語(yǔ)言常見(jiàn)錯(cuò)誤接口污染解決分析
- Go編程中常見(jiàn)錯(cuò)誤和不良實(shí)踐解析
- Go并發(fā)編程中的錯(cuò)誤恢復(fù)機(jī)制與代碼持續(xù)執(zhí)行實(shí)例探索
相關(guān)文章
golang gin 框架 異步同步 goroutine 并發(fā)操作
這篇文章主要介紹了golang gin 框架 異步同步 goroutine 并發(fā)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
vscode搭建go開(kāi)發(fā)環(huán)境案例詳解
對(duì)于Visual Studio Code開(kāi)發(fā)工具,有一款優(yōu)秀的GoLang插件,今天通過(guò)本文給大家介紹下vscode搭建go開(kāi)發(fā)環(huán)境的詳細(xì)教程,感興趣的朋友跟隨小編一起看看吧2021-12-12
Golang實(shí)現(xiàn)按行讀取文件的方法小結(jié)
按行讀取文件相較于一次性載入,有著很多優(yōu)勢(shì),如內(nèi)存效率高、處理速度快、實(shí)時(shí)性高等,本文主要介紹了Golang按行讀取文件的相關(guān)方法,希望對(duì)大家有所幫助2024-02-02
詳解Golang利用反射reflect動(dòng)態(tài)調(diào)用方法
這篇文章主要介紹了詳解Golang利用反射reflect動(dòng)態(tài)調(diào)用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11
從源碼深入理解golang?RWMutex讀寫(xiě)鎖操作
這篇文章主要介紹了從源碼深入理解golang?RWMutex讀寫(xiě)鎖操作,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05

