最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

從錯(cuò)誤中學(xué)習(xí)改正Go語(yǔ)言六個(gè)壞習(xí)慣提高編程技巧

 更新時(shí)間:2024年01月16日 10:53:33   作者:Slagga  
這篇文章主要為大家介紹了從錯(cuò)誤中學(xué)習(xí)改正Go語(yǔ)言五個(gè)壞習(xí)慣提高編程技巧示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

從他人的錯(cuò)誤中學(xué)習(xí),通過(guò)本指南避免常見陷阱和壞習(xí)慣,提高你的 Go 編程技巧

在 Go 語(yǔ)言中,就像在任何編程語(yǔ)言中一樣,了解常見陷阱和壞習(xí)慣是編寫干凈、高效代碼的關(guān)鍵。

盡管下面列出的某些做法通常被認(rèn)為是不好的,但在某些情況下它們可以有效地使用。 這篇文章旨在提醒大家這些做法的問(wèn)題所在,并教導(dǎo)如何避免這些陷阱。

讓我們深入探討。

1. 使用 init()

在 Go 中,init()函數(shù)是在主函數(shù)之前執(zhí)行的特殊函數(shù)。

“如果在任何包中初始化是如此重要的過(guò)程,為什么在 Go 中init()被認(rèn)為是一種不好的實(shí)踐?” —— 讀者

是的,雖然init()函數(shù)有助于在運(yùn)行核心邏輯之前進(jìn)行初始化,但它們的執(zhí)行順序可能難以理解。 這可能會(huì)導(dǎo)致關(guān)于初始化順序的混亂。

如果兩個(gè)模塊互相依賴于初始化并位于不同的包中,則可能會(huì)增加復(fù)雜性并需要額外的代碼添加等待邏輯。然而,這也可能導(dǎo)致死鎖的可能性。

另一個(gè)init()函數(shù)的問(wèn)題是它會(huì)使測(cè)試更加困難。因?yàn)樗鼈冏詣?dòng)運(yùn)行,很難控制它們何時(shí)執(zhí)行,這可能使設(shè)置測(cè)試用例和測(cè)試代碼行為變得具有挑戰(zhàn)性。

我遇到了一個(gè)問(wèn)題,我的服務(wù)從部署狀態(tài)到準(zhǔn)備就緒需要 10 分鐘的時(shí)間。我在主函數(shù)的第一行設(shè)置了斷點(diǎn),但它從未觸發(fā)。

我們不得不調(diào)試所有的init()函數(shù),發(fā)現(xiàn)一個(gè)隊(duì)友在一個(gè)“我不記得的包”中使用了init()函數(shù),從一個(gè)大文件加載了大量數(shù)據(jù)到內(nèi)存中,這導(dǎo)致花費(fèi)了很多時(shí)間追蹤一個(gè)微小的問(wèn)題。

2. 使用全局變量

這與使用單例模式時(shí)可能出現(xiàn)的問(wèn)題類似,特別是當(dāng)全局變量是復(fù)雜的,包含映射、切片或指針時(shí)。

  • 競(jìng)態(tài)條件(Race condition):當(dāng)使用全局變量時(shí),多個(gè)goroutine同時(shí)訪問(wèn)全局變量會(huì)導(dǎo)致意外行為。這在Go語(yǔ)言中是一個(gè)很大的問(wèn)題。

  • 難以測(cè)試:使用全局變量會(huì)使你的項(xiàng)目更具狀態(tài),這意味著當(dāng)你開始單元測(cè)試/集成測(cè)試時(shí),全局變量必須與運(yùn)行main()或生產(chǎn)環(huán)境時(shí)相同。

  • 不夠模塊化且難以重用:難以組織和封裝數(shù)據(jù),因?yàn)槿魏伟蚰K都可以訪問(wèn)它們。這可能會(huì)導(dǎo)致代碼不夠模塊化,更難以理解,因?yàn)楹茈y確定數(shù)據(jù)來(lái)自哪里以及如何使用它們。

通常建議封裝您的包,使其可以在不影響其他包的情況下移動(dòng)。使用全局變量可能會(huì)使您的代碼更緊密耦合,更難以修改或重用。

3. 忽略錯(cuò)誤消息

錯(cuò)誤是Go編程的內(nèi)在部分,處理它們以優(yōu)雅的方式確保在發(fā)生錯(cuò)誤時(shí)不會(huì)發(fā)生意外情況非常重要。

忽略錯(cuò)誤消息的方法是使用“_”符號(hào),這樣做會(huì)丟棄函數(shù)返回的錯(cuò)誤值,可能會(huì)導(dǎo)致意外行為。

檢查錯(cuò)誤并適當(dāng)?shù)靥幚硭鼈円苑乐钩绦虬l(fā)生崩潰和崩潰非常重要。

// sample 1
func main() {
    var x interface{} = "hello"
    s := x.(int) // panic: interface conversion: interface {} is string, not int
    fmt.Println(s)
}
// sample 2
func main() {
    var x interface{} = "hello"
    s, _ := x.(int) // safe but DON'T
    fmt.Println(s)
}

忽略錯(cuò)誤處理會(huì)導(dǎo)致生產(chǎn)代碼中出現(xiàn)重大問(wèn)題,因?yàn)檫@可能使得識(shí)別和修復(fù)錯(cuò)誤變得困難。始終檢查錯(cuò)誤并適當(dāng)?shù)亟鉀Q它們對(duì)于確保代碼的順暢運(yùn)行非常重要。

4. GOTO語(yǔ)句 — 跳進(jìn)陷阱

不僅在Go語(yǔ)言中,許多語(yǔ)言都認(rèn)為使用“goto”語(yǔ)句是一種不良實(shí)踐,因?yàn)樗鼤?huì)使代碼更難理解和維護(hù)。

原因是“goto”語(yǔ)句忽略了代碼流程,使得在不引入錯(cuò)誤的情況下難以理解代碼的不同部分之間的依賴關(guān)系。

這可能會(huì)使得在運(yùn)行時(shí)推理程序的狀態(tài)變得困難,使得調(diào)試和測(cè)試變得更加困難。

使用“goto”可能會(huì)導(dǎo)致錯(cuò)誤數(shù)量增加,使得更難以識(shí)別問(wèn)題的根本原因。

5. 不使用Defer和Recover

利用“defer”和“recover”的主要原因是為了防止恐慌。“defer”甚至可以在發(fā)生恐慌時(shí)執(zhí)行,而“recover”可以捕捉到恐慌,允許更加控制地處理意外情況。

這種使用方式被認(rèn)為是不好的代碼實(shí)踐:

func readFile(filename string) {
    file, err := os.Open(filename)
    if err != nil {
        panic(err)
    }
    // Do something with the file
    file.Close() // <--- DONT
}

我們使用defer這種方式,這樣即使readFile()函數(shù)出現(xiàn)panic,文件也會(huì)被關(guān)閉。此外,這樣做也容易記住在open()函數(shù)之后立即放置關(guān)閉函數(shù)。

func readFile(filename string) {
    file, err := os.Open(filename)
    if err != nil {
        log.Fatal(err)
    }
    defer file.Close()
    // Do something with the file
    ...
}

6. 使用太多次的context.Background()

在 Go 中,上下文是最強(qiáng)大的功能之一。當(dāng)正確使用時(shí),它可以作為提供程序、樹流和流控制器。

在進(jìn)行外部調(diào)用(例如數(shù)據(jù)庫(kù)、HTTP 等)時(shí),使用context.Background()context.ToDo()設(shè)置截止時(shí)間或超時(shí)非常重要。如果沒(méi)有設(shè)置,當(dāng)用戶過(guò)多且外部服務(wù)沒(méi)有及時(shí)響應(yīng)時(shí),可能會(huì)導(dǎo)致您的應(yīng)用程序出現(xiàn)瓶頸。

我通常會(huì)編寫一個(gè)上下文池的實(shí)用函數(shù),其中包括 3 個(gè)函數(shù)來(lái)創(chuàng)建或包裝具有超時(shí)的新上下文:快速(0.5 秒)、中等(3 秒)、慢速(10 秒)。這樣,我就不必一直依賴context.Background(),并且可以輕松地為每個(gè)調(diào)用設(shè)置適當(dāng)?shù)某瑫r(shí)時(shí)間。

const FastTimeout = 500 * time.Millisecond
func WrapCustomContext(ctx context.Context, dur time.Duration) (context.Context, context.CancelFunc) {
    return context.WithTimeout(context.Background(), dur)
}
func GenFastContext() (context.Context, context.CancelFunc) {
    return WrapCustomContext(context.Background(), FastTimeout)
}
func WrapFastContext(ctx context.Context) (context.Context, context.CancelFunc) {
    return WrapCustomContext(ctx, FastTimeout)
}

以上就是從錯(cuò)誤中學(xué)習(xí)改正Go語(yǔ)言壞習(xí)慣提高編程技巧的詳細(xì)內(nèi)容,更多關(guān)于Go語(yǔ)言編程習(xí)慣的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 解決Golang中ResponseWriter的一個(gè)坑

    解決Golang中ResponseWriter的一個(gè)坑

    這篇文章主要介紹了解決Golang中ResponseWriter的一個(gè)坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • Golang中對(duì)json的優(yōu)雅處理方式

    Golang中對(duì)json的優(yōu)雅處理方式

    這篇文章主要給大家介紹了關(guān)于Golang中對(duì)json的優(yōu)雅處理方式,解析JSON在golang中很麻煩,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • Go語(yǔ)言常見錯(cuò)誤之a(chǎn)ny沒(méi)傳遞任何信息解決分析

    Go語(yǔ)言常見錯(cuò)誤之a(chǎn)ny沒(méi)傳遞任何信息解決分析

    Go語(yǔ)言,由于其高效強(qiáng)大的并行處理能力和優(yōu)雅簡(jiǎn)單的設(shè)計(jì)哲學(xué),一直以來(lái)都是編程世界的寵兒,然而,對(duì)于一些Go新手和甚至熟悉Go的程序員也可能會(huì)遇到一個(gè)常見的錯(cuò)誤:?any沒(méi)傳遞任何信息,那么,如何規(guī)避這個(gè)錯(cuò)誤,本文將揭示其中的秘密
    2024-01-01
  • golang替換無(wú)法顯示的特殊字符(\u0000,?\000,?^@)

    golang替換無(wú)法顯示的特殊字符(\u0000,?\000,?^@)

    這篇文章主要介紹了golang替換無(wú)法顯示的特殊字符,包括的字符有\(zhòng)u0000,?\000,?^@等,下文詳細(xì)資料,需要的小伙伴可以參考一下
    2022-04-04
  • golang image圖片處理示例

    golang image圖片處理示例

    這篇文章主要介紹了golang image圖片處理的方法,結(jié)合實(shí)例形式分析了Go語(yǔ)言針對(duì)圖片的打開、讀取、轉(zhuǎn)換等相關(guān)操作技巧,需要的朋友可以參考下
    2016-07-07
  • win7下配置GO語(yǔ)言環(huán)境 + eclipse配置GO開發(fā)

    win7下配置GO語(yǔ)言環(huán)境 + eclipse配置GO開發(fā)

    這篇文章主要介紹了win7下配置GO語(yǔ)言環(huán)境 + eclipse配置GO開發(fā),需要的朋友可以參考下
    2014-10-10
  • Golang 如何解析和生成json

    Golang 如何解析和生成json

    這篇文章主要介紹了Golang 如何解析和生成json,幫助大家更好的理解和學(xué)習(xí)golang,感興趣的朋友可以了解下
    2020-09-09
  • go連接mysql的項(xiàng)目實(shí)踐

    go連接mysql的項(xiàng)目實(shí)踐

    本文主要介紹了go連接mysql的項(xiàng)目實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Golang接口型函數(shù)使用小結(jié)

    Golang接口型函數(shù)使用小結(jié)

    接口函數(shù)指的是用函數(shù)實(shí)現(xiàn)接口,這樣在調(diào)用的時(shí)候就會(huì)非常簡(jiǎn)便,這種方式適用于只有一個(gè)函數(shù)的接口,這里以迭代一個(gè)map為例,演示這一實(shí)現(xiàn)的技巧,對(duì)Golang接口型函數(shù)使用知識(shí)感興趣的朋友一起看看吧
    2022-06-06
  • Go語(yǔ)言使用Json的方法實(shí)現(xiàn)

    Go語(yǔ)言使用Json的方法實(shí)現(xiàn)

    本文主要介紹了Go語(yǔ)言使用Json的方法實(shí)現(xiàn)
    2024-05-05

最新評(píng)論

木兰县| 威海市| 陆川县| 溧水县| 松阳县| 靖远县| 乌海市| 五寨县| 公主岭市| 衡东县| 丰顺县| 宁强县| 达孜县| 慈利县| 清镇市| 黎平县| 兴仁县| 罗田县| 霞浦县| 张家川| 安宁市| 祁门县| 开远市| 六盘水市| 崇义县| 东城区| 湖南省| 博客| 福贡县| 梧州市| 磐石市| 钟山县| 繁峙县| 鄱阳县| 西青区| 黄冈市| 禄劝| 曲麻莱县| 诏安县| 宁强县| 肃南|