今天我們要實作的函數功能是:對 map 裡所有的 value 求和。
非泛型函數
如果沒有泛型該如何實作呢?因為value 可能會有不同的類型,例如:int64、float64 等,沒有泛型的話,針對不同類型需要透過不同的函數來實現,所以我們一般都會像下面這樣實現:
func SumInts(m map[string]int64) int64 { var s int64 for _, v := range m { s += v } return s } func SumFloats(m map[string]float64) float64 { var s float64 for _, v := range m { s += v } return s }
上面的程式碼,我們定義了兩個函數:
1、SumInts() 計算value 為int64 類型的總和;2、SumFloats() 計算value 為float64 類型的總和;
上面函數只適用於int64、float64 類型,那如果我們還想計算int、float32 等,就得把上面的函數重新copy 一份修改下類型。
這樣做豈不是稍顯麻煩,而且程式碼很臃腫,你還別說,之前標準套件有很多類似的程式碼,像是標準函式庫的Sort 套件(sort.go) 為了實現不同類型切片的排序,定義了IntSlice、Float64Slice、StringSlice。
因為之前 Go 版本不支援泛型,只能這樣實現,這也是最簡單的一種方法。
有了泛型之後,針對不同型別 int64、float64,該如何實作一個函數就能計算出 value 的總和呢?
泛型函數
這一小節我們透過一個泛型函數實作既可以接收value 為int64 類型的map 作為參數,也可以接收value 為float64 類型的map 作為參數。
完整程式碼如下:
func Sum[K comparable, V int64 | float64](m map[K]V "K comparable, V int64 | float64") V { var s V for _, v := range m { s += v } return s } func main() { ints := map[string]int64{ "first": 1, "second": 2, } fmt.Println(Sum[string, int64](ints "string, int64")) floats := map[string]float64{ "first": 35.98, "second": 26.99, } fmt.Println(Sum[string, float64](floats "string, float64")) }
上面的程式碼,我們定義了Sum() 函數,它是一個泛型函數,可以看到與普通函數不同的是,在函數名稱與函數參數列表之間有一組方括號[],方括號裡有兩個參數K 和V,Go 語言稱為型別參數,緊接在K、V 後面是型別限制,其中comparable 是Go 語言預先宣告的,表示任何能做== 和!= 操作的型別。 V 的型別限制是 int64、float64 其中的一種。函數參數是 m,型別是 map[K]V,回傳型別是 V。
呼叫函數也與呼叫普通函數有點不同,在函數名稱與實參之間有一組方括號 [],指明了類型名稱。例如第一次呼叫 Sum() 函數時,型別名稱分別是 string、int64,那麼在執行函數時,對應 K、V 的型別分別是 string 和 int64。
第二次调用该 Sum() 函数时,K、V 的类型分别是 string 和 float64。
通过泛型编程,我们就可以实现一个函数处理多种数据类型。
执行上面的代码输出:
3 62.97
以上是Go1.18 泛型初探的詳細內容。更多資訊請關注PHP中文網其他相關文章!

golangisidealforperformance-Critical-clitageAppations and ConcurrentPrompromming,而毛皮刺激性,快速播種和可及性。 1)forhigh-porformanceneeds,pelectgolangduetoitsefefsefefseffifeficefsefeflicefsiveficefsiveandconcurrencyfeatures.2)fordataa-fordataa-fordata-fordata-driventriventriventriventriventrivendissp pynonnononesp

Golang通過goroutine和channel實現高效並發:1.goroutine是輕量級線程,使用go關鍵字啟動;2.channel用於goroutine間安全通信,避免競態條件;3.使用示例展示了基本和高級用法;4.常見錯誤包括死鎖和數據競爭,可用gorun-race檢測;5.性能優化建議減少channel使用,合理設置goroutine數量,使用sync.Pool管理內存。

Golang更適合系統編程和高並發應用,Python更適合數據科學和快速開發。 1)Golang由Google開發,靜態類型,強調簡潔性和高效性,適合高並發場景。 2)Python由GuidovanRossum創造,動態類型,語法簡潔,應用廣泛,適合初學者和數據處理。

Golang在性能和可擴展性方面優於Python。 1)Golang的編譯型特性和高效並發模型使其在高並發場景下表現出色。 2)Python作為解釋型語言,執行速度較慢,但通過工具如Cython可優化性能。

Go語言在並發編程、性能、學習曲線等方面有獨特優勢:1.並發編程通過goroutine和channel實現,輕量高效。 2.編譯速度快,運行性能接近C語言。 3.語法簡潔,學習曲線平緩,生態系統豐富。

Golang和Python的主要區別在於並發模型、類型系統、性能和執行速度。 1.Golang使用CSP模型,適用於高並發任務;Python依賴多線程和GIL,適合I/O密集型任務。 2.Golang是靜態類型,Python是動態類型。 3.Golang編譯型語言執行速度快,Python解釋型語言開發速度快。

Golang通常比C 慢,但Golang在並發編程和開發效率上更具優勢:1)Golang的垃圾回收和並發模型使其在高並發場景下表現出色;2)C 通過手動內存管理和硬件優化獲得更高性能,但開發複雜度較高。

Golang在雲計算和DevOps中的應用廣泛,其優勢在於簡單性、高效性和並發編程能力。 1)在雲計算中,Golang通過goroutine和channel機制高效處理並發請求。 2)在DevOps中,Golang的快速編譯和跨平台特性使其成為自動化工具的首選。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SublimeText3 Linux新版
SublimeText3 Linux最新版

SublimeText3漢化版
中文版,非常好用

Atom編輯器mac版下載
最受歡迎的的開源編輯器

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)