Go語(yǔ)言中的函數(shù)、閉包、defer、錯(cuò)誤處理的學(xué)習(xí)教程
1、函數(shù)的定義
本篇我們來(lái)講解 Go 語(yǔ)言中的函數(shù)。Go 語(yǔ)言支持普通函數(shù)、匿名函數(shù)和閉包。本節(jié)將重點(diǎn)介紹最基礎(chǔ)和最常用的普通函數(shù)。
1、 函數(shù)作為“一等公民”
在 Go 語(yǔ)言中,函數(shù)是 “一等公民” (First-Class Citizens)。對(duì)于初學(xué)者而言,這可能是一個(gè)新概念,它主要包含以下特性:
函數(shù)可以作為變量:可以將一個(gè)函數(shù)賦值給一個(gè)變量,通過(guò)該變量來(lái)調(diào)用函數(shù)。
函數(shù)可以作為參數(shù)和返回值:可以將函數(shù)作為另一個(gè)函數(shù)的參數(shù)進(jìn)行傳遞,或作為其返回值。
函數(shù)可以滿足接口(Interface):這是一個(gè)更高級(jí)的用法,我們后續(xù)會(huì)接觸到。
當(dāng)前,我們只需重點(diǎn)理解第一點(diǎn):函數(shù)本身可以像普通變量一樣被傳遞和賦值。這一特性為 Go 語(yǔ)言帶來(lái)了強(qiáng)大的靈活性。
2、函數(shù)的定義與調(diào)用
語(yǔ)法結(jié)構(gòu)
Go 函數(shù)的定義包含四個(gè)核心部分:func 關(guān)鍵字、函數(shù)名、參數(shù)列表和返回值列表。
func 函數(shù)名(參數(shù)列表) (返回值列表) {
函數(shù)體
}
注意,與許多其他語(yǔ)言不同,Go 的返回值類型被放置在參數(shù)列表之后。
基本示例
我們定義一個(gè)簡(jiǎn)單的加法函數(shù) add。它接收兩個(gè) int 類型的參數(shù)并返回一個(gè) int 類型的結(jié)果。

多參數(shù)簡(jiǎn)寫(xiě)與多返回值
參數(shù)簡(jiǎn)寫(xiě):如果連續(xù)多個(gè)參數(shù)的類型相同,可以省略前面參數(shù)的類型聲明。
多返回值:Go 函數(shù)可以返回多個(gè)值,這在處理錯(cuò)誤時(shí)尤其有用。

3、 參數(shù)傳遞:值傳遞 (Pass-by-Value)
這是一個(gè)至關(guān)重要的概念:Go 語(yǔ)言中所有函數(shù)參數(shù)都是值傳遞(Pass-by-Value)。
- 什么是值傳遞? 當(dāng)調(diào)用函數(shù)時(shí),傳遞給函數(shù)的參數(shù)是原始值的副本 (Copy)。函數(shù)內(nèi)部對(duì)這些副本參數(shù)的任何修改,都不會(huì)影響到函數(shù)外部的原始變量。
我們可以通過(guò)一個(gè)例子來(lái)清晰地理解這一點(diǎn):

從輸出可以看到,盡管函數(shù)內(nèi)部的參數(shù) a 被修改為 100,但 main 函數(shù)中的 originalA 變量的值始終是 1,未受任何影響。
本節(jié)我們學(xué)習(xí)了 Go 函數(shù)的基本定義、調(diào)用方式以及核心的值傳遞機(jī)制。理解值傳遞對(duì)于預(yù)測(cè)代碼行為至關(guān)重要。
那么,如果確實(shí)需要在函數(shù)內(nèi)部修改外部變量的值,應(yīng)該怎么做呢?答案是使用指針 (Pointer)。通過(guò)傳遞變量的內(nèi)存地址,函數(shù)就可以操作原始變量。我們將在后續(xù)章節(jié)中詳細(xì)探討指針的用法。
2、函數(shù)的可變參數(shù)
在掌握了函數(shù)的基本定義后,本節(jié)我們繼續(xù)探討 Go 語(yǔ)言中一些更高級(jí)且實(shí)用的函數(shù)特性,包括命名返回值和可變參數(shù)。
1、返回值詳解
無(wú)返回值
并非所有函數(shù)都需要返回值。當(dāng)一個(gè)函數(shù)執(zhí)行一個(gè)動(dòng)作或過(guò)程,而不需要向調(diào)用者反饋結(jié)果時(shí),可以省略返回值列表。這在初始化函數(shù)或需要持續(xù)運(yùn)行的后臺(tái)任務(wù)(如服務(wù)監(jiān)聽(tīng))中很常見(jiàn)。

命名返回值 (Named Return Values)
除了指定返回值的類型,Go 還允許為返回值命名。這相當(dāng)于在函數(shù)頂部預(yù)先聲明了用于返回的變量。
優(yōu)點(diǎn):
代碼更清晰:可以直接為這些預(yù)聲明的變量賦值,省去了在函數(shù)體內(nèi)
var聲明的步驟。支持“裸返回”:可以只使用
return關(guān)鍵字而不帶任何變量,函數(shù)會(huì)自動(dòng)返回已命名的返回值變量的當(dāng)前值。

注意:雖然“裸返回”可以使代碼更簡(jiǎn)潔,但在較長(zhǎng)的函數(shù)中可能會(huì)降低可讀性。因此,建議在簡(jiǎn)短、清晰的函數(shù)中使用。
2、可變參數(shù) (Variadic Parameters)
在某些場(chǎng)景下,我們希望函數(shù)能接收不定數(shù)量的參數(shù)。Go 通過(guò) ... 語(yǔ)法糖支持可變參數(shù)。
核心規(guī)則:
一個(gè)函數(shù)最多只能有一個(gè)可變參數(shù)。
可變參數(shù)必須是函數(shù)簽名中的最后一個(gè)參數(shù)。
在函數(shù)內(nèi)部,該可變參數(shù)的類型是一個(gè)切片 (slice)。
示例:實(shí)現(xiàn)一個(gè)通用的加法函數(shù)
我們可以定義一個(gè) sumAll 函數(shù),它可以計(jì)算任意多個(gè)整數(shù)的和。

如上例所示,sumAll 函數(shù)的第一個(gè)參數(shù) description 是一個(gè)固定的 string 類型參數(shù),而第二個(gè)參數(shù) items 則是可變的 int 類型參數(shù)。這種組合在實(shí)際開(kāi)發(fā)中非常靈活和有用,例如標(biāo)準(zhǔn)庫(kù)中的 fmt.Println 函數(shù)就使用了這種機(jī)制來(lái)接收任意數(shù)量和類型的參數(shù)。
3、函數(shù)一等公民特性
在 Go 語(yǔ)言中,函數(shù)是“一等公民”,這意味著它們可以像任何其他類型(如 int 或 string)的值一樣被處理。這一特性極大地增強(qiáng)了代碼的靈活性和表達(dá)力,是構(gòu)建高級(jí)抽象和并發(fā)模式的基礎(chǔ)。
“一等公民”主要體現(xiàn)在以下三個(gè)方面:
函數(shù)可以被賦值給變量。
函數(shù)可以作為參數(shù)傳遞給其他函數(shù)。
函數(shù)可以作為另一個(gè)函數(shù)的返回值。
本節(jié)將通過(guò)實(shí)例深入探討這些特性。
1、函數(shù)作為變量
你可以將一個(gè)已定義的函數(shù)直接賦值給一個(gè)變量,然后通過(guò)這個(gè)變量來(lái)調(diào)用該函數(shù)。

這表明 op 變量現(xiàn)在持有了 add 函數(shù)的引用,并可以像原始函數(shù)一樣被調(diào)用。
2、函數(shù)作為參數(shù)(回調(diào)函數(shù))
將函數(shù)作為另一個(gè)函數(shù)的參數(shù)傳遞,是實(shí)現(xiàn)回調(diào) (Callback) 機(jī)制的經(jīng)典方式。這允許我們將行為“注入”到函數(shù)中,使其功能更加通用。

3、 函數(shù)作為返回值
函數(shù)也可以作為另一個(gè)函數(shù)的執(zhí)行結(jié)果被返回。這常用于創(chuàng)建“工廠函數(shù)”,根據(jù)輸入條件生成并返回具有特定行為的新函數(shù)。

4、 匿名函數(shù) (Anonymous Functions)
在上面的例子中,我們已經(jīng)看到了匿名函數(shù)(也稱為函數(shù)字面量),即沒(méi)有名稱的函數(shù)。它們?cè)谛枰粋€(gè)臨時(shí)、一次性的函數(shù)時(shí)非常有用。
4.1定義和使用方式
1.賦值給變量

2.作為參數(shù)直接傳遞
這種方式在需要回調(diào)時(shí)尤其方便,無(wú)需預(yù)先定義一個(gè)具名函數(shù)。

函數(shù)作為 Go 語(yǔ)言的“一等公民”,是其強(qiáng)大功能和靈活性的基石。通過(guò)將函數(shù)作為變量、參數(shù)和返回值,我們可以編寫(xiě)出高度模塊化、可復(fù)用且富有表現(xiàn)力的代碼。這些模式在 Go 的標(biāo)準(zhǔn)庫(kù)、開(kāi)源項(xiàng)目以及日常開(kāi)發(fā)中都得到了廣泛應(yīng)用,是每位 Go 開(kāi)發(fā)者都必須熟練掌握的核心技能。
4、閉包
“閉包”是編程中一個(gè)強(qiáng)大但有時(shí)難以理解的概念。我們不從枯燥的定義開(kāi)始,而是通過(guò)解決一個(gè)具體問(wèn)題來(lái)直觀地理解它。
1、問(wèn)題:如何創(chuàng)建一個(gè)能“記憶”狀態(tài)的函數(shù)?
需求:創(chuàng)建一個(gè)函數(shù),每次調(diào)用它時(shí),返回的數(shù)字都會(huì)比上一次大 1。
一個(gè)直觀的想法是使用全局變量來(lái)保存計(jì)數(shù)器的狀態(tài)。

這個(gè)方法雖然可行,但存在明顯缺陷:
污染全局作用域:
counter變量暴露在全局,任何地方的代碼都可以無(wú)意中修改它,導(dǎo)致程序不穩(wěn)定。無(wú)法創(chuàng)建獨(dú)立實(shí)例:如果想同時(shí)擁有多個(gè)獨(dú)立的計(jì)數(shù)器(例如,一個(gè)從 0 開(kāi)始,另一個(gè)也從 0 開(kāi)始),全局變量無(wú)法滿足。
難以重置:想讓計(jì)數(shù)器歸零,必須手動(dòng)修改全局變量,這在并發(fā)環(huán)境下會(huì)變得非常復(fù)雜且容易出錯(cuò)。
2、解決方案:使用閉包
閉包可以完美解決上述問(wèn)題。它允許一個(gè)函數(shù)“記住”并訪問(wèn)其被創(chuàng)建時(shí)的環(huán)境。
讓我們重構(gòu)代碼:

3、閉包如何工作?
環(huán)境封裝:當(dāng)
autoIncrement函數(shù)被調(diào)用時(shí),它創(chuàng)建了一個(gè)局部變量localCounter。返回函數(shù):
autoIncrement并不直接返回值,而是返回一個(gè)內(nèi)部定義的匿名函數(shù)。“記憶”效應(yīng):這個(gè)被返回的匿名函數(shù)持有對(duì)其創(chuàng)建時(shí)所在作用域(
autoIncrement的作用域)的引用。因此,即使autoIncrement函數(shù)已經(jīng)執(zhí)行完畢,它的局部變量localCounter也不會(huì)被銷毀,因?yàn)樗匀槐环祷氐哪莻€(gè)匿名函數(shù)引用著。這個(gè)被“記住”的環(huán)境和函數(shù)的組合,就是閉包。
關(guān)鍵點(diǎn):
狀態(tài)隔離:
localCounter變量被封裝在閉包內(nèi)部,外部代碼無(wú)法直接訪問(wèn),避免了全局污染。獨(dú)立實(shí)例:每次調(diào)用
autoIncrement()都會(huì)創(chuàng)建一個(gè)全新的作用域和全新的localCounter變量。因此,next1和next2是兩個(gè)完全獨(dú)立、互不干擾的計(jì)數(shù)器。生命周期:閉包內(nèi)的變量會(huì)一直存活,直到?jīng)]有任何函數(shù)引用它為止,然后才會(huì)被垃圾回收。
閉包是 Go 語(yǔ)言中一個(gè)極其有用的特性,是實(shí)現(xiàn)狀態(tài)封裝、函數(shù)式編程和并發(fā)模式(如 goroutine)的關(guān)鍵工具。
4、defer 語(yǔ)句
defer 是 Go 語(yǔ)言中一個(gè)獨(dú)特且強(qiáng)大的關(guān)鍵字,用于延遲一個(gè)函數(shù)或方法的執(zhí)行。被 defer 的函數(shù)調(diào)用會(huì)推遲到其所在的函數(shù)即將返回之前執(zhí)行。這個(gè)機(jī)制在資源管理和錯(cuò)誤處理中非常有用。
1、defer的核心用途:資源清理
在編程中,我們經(jīng)常需要處理需要手動(dòng)釋放的資源,例如:
數(shù)據(jù)庫(kù)連接
文件句柄
互斥鎖
一個(gè)常見(jiàn)的模式是:在函數(shù)開(kāi)始時(shí)獲取資源,在函數(shù)結(jié)束時(shí)釋放它。defer 語(yǔ)句極大地簡(jiǎn)化了這一過(guò)程,并確保資源總能被正確釋放。
傳統(tǒng)方式的問(wèn)題 在沒(méi)有 defer 的情況下,你可能需要將釋放資源的代碼寫(xiě)在函數(shù)的末尾。
func process() {
mutex.Lock() // 加鎖
// ... 大量的業(yè)務(wù)邏輯代碼 ...
// 如果在這里忘記解鎖,將導(dǎo)致死鎖
mutex.Unlock() // 解鎖
}
這種方式有兩個(gè)主要問(wèn)題:
容易遺忘:當(dāng)函數(shù)邏輯復(fù)雜或有多個(gè)返回路徑時(shí),很容易忘記在每個(gè)出口都添加解鎖代碼。
可讀性差:資源獲?。?code>Lock)和釋放(
Unlock)的代碼相距甚遠(yuǎn),增加了代碼維護(hù)的難度。
defer 的優(yōu)雅解決方案 defer 將資源獲取和釋放操作緊密地放在一起,從根本上解決了上述問(wèn)題。

defer 的優(yōu)勢(shì):
確保執(zhí)行:無(wú)論函數(shù)是正常返回,還是因?yàn)?
panic而異常退出,defer語(yǔ)句總會(huì)被執(zhí)行。提升可讀性:資源獲取和釋放的代碼緊挨在一起,代碼意圖一目了然
2、多個(gè)defer的執(zhí)行順序
一個(gè)函數(shù)中可以有多個(gè) defer 語(yǔ)句。它們的執(zhí)行順序遵循后進(jìn)先出(LIFO, Last-In-First-Out) 的原則,就像棧一樣。

最后被 defer 的語(yǔ)句會(huì)最先執(zhí)行。
3、defer與返回值
defer 語(yǔ)句在函數(shù)的 return 指令之后,但在函數(shù)真正返回給調(diào)用者之前執(zhí)行。這使得 defer 有機(jī)會(huì)讀取并修改函數(shù)的返回值。為了實(shí)現(xiàn)這一點(diǎn),函數(shù)需要使用命名返回值。

執(zhí)行流程分析:
return 10語(yǔ)句首先將返回值ret賦值為10。接著,執(zhí)行
defer中的匿名函數(shù)。該函數(shù)訪問(wèn)并修改了ret,使其值變?yōu)?11。最后,函數(shù)將
ret的最終值11返回給調(diào)用者。
defer 是 Go 語(yǔ)言中一個(gè)非常實(shí)用的特性。養(yǎng)成使用 defer 進(jìn)行資源清理的習(xí)慣,可以編寫(xiě)出更健壯、更清晰的代碼。理解其 LIFO 的執(zhí)行順序以及與命名返回值的交互,能幫助你更深入地掌握 Go 的函數(shù)編程。
5、錯(cuò)誤處理
在任何編程語(yǔ)言中,錯(cuò)誤處理都是構(gòu)建健壯程序的關(guān)鍵。Go 語(yǔ)言在此方面采取了一種獨(dú)特而明確的策略,主要圍繞三個(gè)核心概念展開(kāi):
error:一種內(nèi)置接口類型,是 Go 中最主要的錯(cuò)誤處理方式。panic:一個(gè)內(nèi)置函數(shù),用于處理無(wú)法恢復(fù)的、導(dǎo)致程序中斷的嚴(yán)重錯(cuò)誤。recover:一個(gè)內(nèi)置函數(shù),用于重新獲得對(duì)panic的控制權(quán),常在defer中使用。
本節(jié)我們首先關(guān)注最基礎(chǔ)且最常用的 error。
1、Go 的錯(cuò)誤處理理念
Go 的錯(cuò)誤處理哲學(xué)與其他語(yǔ)言(如 Java 或 Python)的 try-catch 異常機(jī)制有顯著區(qū)別。Go 語(yǔ)言的設(shè)計(jì)者認(rèn)為,錯(cuò)誤是程序正常流程的一部分,應(yīng)該被顯式地處理。
其核心理念是:任何可能失敗的函數(shù),都應(yīng)該將 error 作為其最后一個(gè)返回值。
// 一個(gè)可能失敗的函數(shù)簽名 func DoSomething(param T) (ResultType, error)
調(diào)用者通過(guò)檢查返回的 error 值是否為 nil 來(lái)判斷操作是否成功。如果 error 不為 nil,則表示發(fā)生了錯(cuò)誤,調(diào)用者有責(zé)任處理這個(gè)錯(cuò)誤。
這種設(shè)計(jì)避免了異常在調(diào)用棧中隱式地向上傳播。開(kāi)發(fā)者必須在每個(gè)可能出錯(cuò)的調(diào)用點(diǎn)做出決策:是處理錯(cuò)誤、記錄日志,還是將錯(cuò)誤包裝后繼續(xù)向上傳遞。
2、if err != nil模式與防御性編程
在 Go 代碼中,你會(huì)頻繁看到以下模式:
value, err := someFunction()
if err != nil {
// 處理錯(cuò)誤...
return err // 或者 log.Fatal(err), etc.
}
// 如果 err 為 nil,繼續(xù)使用 value
盡管這種模式有時(shí)被批評(píng)為冗長(zhǎng),但它體現(xiàn)了 Go 的防御性編程 (Defensive Programming) 思想。它強(qiáng)制開(kāi)發(fā)者正視并處理每一個(gè)潛在的錯(cuò)誤,從而大大提高了程序的健壯性。你必須明確地決定如何應(yīng)對(duì)失敗,而不是忽略它。
3、error的基本使用
error 本質(zhì)上是一個(gè)內(nèi)置的接口類型。任何實(shí)現(xiàn)了 Error() string 方法的類型都可以作為一個(gè) error。最簡(jiǎn)單的創(chuàng)建方式是使用標(biāo)準(zhǔn)庫(kù) errors 包中的 New 函數(shù)。

4、panic:處理嚴(yán)重錯(cuò)誤
panic 是一個(gè)內(nèi)置函數(shù),用于觸發(fā)一個(gè)panic。當(dāng)程序遇到一個(gè)無(wú)法恢復(fù)的嚴(yán)重錯(cuò)誤時(shí)(例如,關(guān)鍵依賴項(xiàng)初始化失?。?,可以調(diào)用 panic 來(lái)立即中止程序的正常執(zhí)行。
一個(gè) panic 會(huì):
停止當(dāng)前函數(shù)的執(zhí)行。
開(kāi)始逐層向上展開(kāi)協(xié)程的調(diào)用棧 (unwinding the goroutine’s stack)。
在展開(kāi)過(guò)程中,執(zhí)行該協(xié)程中所有被
defer的函數(shù)調(diào)用。如果
panic到達(dá)了協(xié)程棧的頂端仍未被recover,程序?qū)⒈罎⒉⒋蛴〕鲥e(cuò)誤信息和完整的調(diào)用棧。

何時(shí)使用 panic?
panic 不應(yīng)該被用作常規(guī)的錯(cuò)誤處理機(jī)制。它的主要應(yīng)用場(chǎng)景是在程序啟動(dòng)階段,檢查到無(wú)法滿足運(yùn)行條件的致命錯(cuò)誤時(shí)。例如:
配置文件加載失敗。
無(wú)法連接到必要的數(shù)據(jù)庫(kù)或服務(wù)。
必要的目錄或文件無(wú)法創(chuàng)建。
在這些情況下,讓程序立即失敗并退出是合理的。一旦服務(wù)進(jìn)入穩(wěn)定運(yùn)行狀態(tài),由用戶請(qǐng)求等外部輸入觸發(fā)的 panic 通常被認(rèn)為是嚴(yán)重的程序缺陷。
5、recover:從panic中恢復(fù)
recover 是一個(gè)只能在 defer 語(yǔ)句中調(diào)用的內(nèi)置函數(shù)。它的作用是捕獲并處理當(dāng)前協(xié)程中的 panic,阻止程序崩潰,并允許程序繼續(xù)執(zhí)行。
基本用法: recover 必須與 defer 配合使用。如果協(xié)程沒(méi)有發(fā)生 panic,recover 會(huì)返回 nil。如果發(fā)生了 panic,recover 會(huì)捕獲到傳遞給 panic 的值,并恢復(fù)正常的執(zhí)行流程。一些語(yǔ)言的內(nèi)置操作,例如對(duì) nil map 進(jìn)行寫(xiě)操作,也會(huì)觸發(fā)隱式的 panic。

6、panic與recover的使用規(guī)則
defer必須在panic前定義:defer語(yǔ)句的執(zhí)行時(shí)機(jī)是函數(shù)返回前,所以它必須在可能發(fā)生panic的代碼之前聲明。recover只在defer函數(shù)中有效:在defer之外調(diào)用recover不會(huì)有任何效果,它只會(huì)返回nil。恢復(fù)后不會(huì)回到
panic點(diǎn):recover捕獲panic后,執(zhí)行流會(huì)從defer語(yǔ)句處繼續(xù),然后函數(shù)正常返回。它不會(huì)回到panic發(fā)生的那一行繼續(xù)執(zhí)行。后進(jìn)先出 (LIFO):多個(gè)
defer語(yǔ)句的執(zhí)行順序是后進(jìn)先出。
通過(guò) error 返回值進(jìn)行顯式錯(cuò)誤處理是 Go 語(yǔ)言的基石。panic 和 recover 則提供了一種處理真正異常和災(zāi)難性情況的機(jī)制,通過(guò)合理的 defer-recover 模式可以構(gòu)建出即使面對(duì)意外 panic 也能保持穩(wěn)定的健壯服務(wù)。
6、總結(jié)
Go語(yǔ)言中函數(shù)包含func關(guān)鍵字、函數(shù)名、參數(shù)列表和返回值列表,Go支持普通函數(shù)、匿名函數(shù)和閉包,值傳遞是Go語(yǔ)言中所有函數(shù)參數(shù)的傳遞方式,defer語(yǔ)句用于延遲函數(shù)的執(zhí)行,適合用于資源清理,Go的錯(cuò)誤處理主要通過(guò)error接口、panic函數(shù)和recover函數(shù)來(lái)實(shí)現(xiàn),鼓勵(lì)顯式錯(cuò)誤處理
到此這篇關(guān)于Go語(yǔ)言中的函數(shù)、閉包、defer、錯(cuò)誤處理的學(xué)習(xí)教程的文章就介紹到這了,更多相關(guān)Go的函數(shù)、閉包、defer、錯(cuò)誤處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語(yǔ)言LeetCode題解706設(shè)計(jì)哈希映射
這篇文章主要為大家介紹了Go語(yǔ)言LeetCode題解706設(shè)計(jì)哈希映射示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
Go語(yǔ)言七篇入門(mén)教程四通道及Goroutine
這篇文章主要為大家介紹了Go語(yǔ)言的通道及Goroutine示例詳解,本文是Go語(yǔ)言七篇入門(mén)系列篇,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-11-11
一文帶大家了解Go語(yǔ)言中的內(nèi)聯(lián)優(yōu)化
內(nèi)聯(lián)優(yōu)化是一種常見(jiàn)的編譯器優(yōu)化策略,通俗來(lái)講,就是把函數(shù)在它被調(diào)用的地方展開(kāi),這樣可以減少函數(shù)調(diào)用所帶來(lái)的開(kāi)銷,本文主要為大家介紹了Go中內(nèi)聯(lián)優(yōu)化的具體使用,需要的可以參考下2023-05-05
Go語(yǔ)言學(xué)習(xí)之Switch語(yǔ)句的使用
這篇文章主要通過(guò)一些示例為大家介紹一下Go語(yǔ)言中Switch語(yǔ)句的基本語(yǔ)法以及使用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-06-06
Go?中?time.After?可能導(dǎo)致的內(nèi)存泄露問(wèn)題解析
這篇文章主要介紹了Go?中?time.After?可能導(dǎo)致的內(nèi)存泄露,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05
Golang實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)Stack(堆棧)的示例詳解
在計(jì)算機(jī)科學(xué)中,stack(棧)是一種基本的數(shù)據(jù)結(jié)構(gòu),它是一種線性結(jié)構(gòu),具有后進(jìn)先出(Last In First Out)的特點(diǎn)。本文將通過(guò)Golang實(shí)現(xiàn)堆棧,需要的可以參考一下2023-04-04
利用Go語(yǔ)言實(shí)現(xiàn)流量回放工具的示例代碼
今天給大家推薦一款使用Go語(yǔ)言編寫(xiě)的流量回放工具?--?goreplay;工作中你一定遇到過(guò)需要在服務(wù)器上抓包的場(chǎng)景,有了這個(gè)工具就可以助你一臂之力,廢話不多,我們接下來(lái)來(lái)看一看這個(gè)工具2022-09-09

