細(xì)細(xì)探究Go 泛型generic設(shè)計(jì)
Go 泛型
的設(shè)計(jì)融入了現(xiàn)代語(yǔ)言的風(fēng)格,比如類(lèi)型限制(type constraint),我們?cè)?TypeScript 和 Python 也能看到這個(gè)特性。
今天我就好好品味一下這個(gè)泛型設(shè)計(jì),和老版本的 Go 做一個(gè)對(duì)比,并且加入類(lèi)型限制的例子。
demo
直接進(jìn)入正題:
package main import "fmt" // 代碼中首先定義了一個(gè)接口類(lèi)型 `Number`, // 它包含了兩個(gè)類(lèi)型:`int64` 和 `float64`。 // 這個(gè)接口類(lèi)型可以被用來(lái)限制泛型函數(shù)的類(lèi)型參數(shù)范圍。 type Number interface { int64 | float64 } // 定義了兩個(gè)非泛型函數(shù) `SumInts` 和 `SumFloats`, // 它們分別用于計(jì)算 `int64` 類(lèi)型和 `float64` 類(lèi)型的 map 中所有值的總和。 // SumInts adds together the values of m. func SumInts(m map[string]int64) int64 { var s int64 for _, v := range m { s += v } return s } // SumFloats adds together the values of m. func SumFloats(m map[string]float64) float64 { var s float64 for _, v := range m { s += v } return s } // 定義了一個(gè)泛型函數(shù) `SumIntsOrFloats`,它接受一個(gè)類(lèi)型為 `map[K]V` 的 map,并返回這個(gè) map 中所有值的總和。 // 這個(gè)函數(shù)使用了兩個(gè)類(lèi)型參數(shù) `K` 和 `V`,其中 `V` 的類(lèi)型可以是 `int64` 或 `float64` 中的一個(gè)。 // 函數(shù)中使用了 `for range` 語(yǔ)句來(lái)遍歷 map 中的值并計(jì)算它們的總和,最終返回這個(gè)總和。 // SumIntsOrFloats sums the values of map m. It supports both floats and integers // as map values. func SumIntsOrFloats[K comparable, V int64 | float64](m map[K]V) V { var s V for _, v := range m { s += v } return s } // `SumNumbers`,它的類(lèi)型參數(shù) `V` 必須實(shí)現(xiàn) `Number` 接口類(lèi)型。 // 這個(gè)函數(shù)和 `SumIntsOrFloats` 函數(shù)類(lèi)似,不同之處在于它使用了 `Number` 接口類(lèi)型來(lái)限制 `V` 的取值范圍 // 只有實(shí)現(xiàn)了 `Number` 接口類(lèi)型的類(lèi)型才能作為 `V` 的值類(lèi)型。 // SumNumbers sums the values of map m. Its supports both integers // and floats as map values. func SumNumbers[K comparable, V Number](m map[K]V) V { var s V for _, v := range m { s += v } return s }
func main() { // Initialize a map for the integer values ints := map[string]int64{ "first": 34, "second": 12, } // Initialize a map for the float values floats := map[string]float64{ "first": 35.98, "second": 26.99, } fmt.Printf("Non-Generic Sums: %v and %v\n", SumInts(ints), SumFloats(floats)) fmt.Printf("Generic Sums: %v and %v\n", SumIntsOrFloats[string, int64](ints), SumIntsOrFloats[string, float64](floats)) fmt.Printf("Generic Sums, type parameters inferred: %v and %v\n", SumIntsOrFloats(ints), SumIntsOrFloats(floats)) fmt.Printf("Generic Sums with Constraint: %v and %v\n", SumNumbers(ints), SumNumbers(floats)) }
在 main
函數(shù)中,代碼初始化了兩個(gè) map,分別用于存儲(chǔ) int64
類(lèi)型和 float64
類(lèi)型的值。接著,代碼使用非泛型的 SumInts
和 SumFloats
函數(shù)來(lái)計(jì)算這兩個(gè) map 中所有值的總和,并打印出結(jié)果。然后,代碼使用泛型的 SumIntsOrFloats
函數(shù)來(lái)計(jì)算這兩個(gè) map 中所有值的總和,并打印出結(jié)果。最后,代碼使用帶有類(lèi)型約束的泛型函數(shù) SumNumbers
來(lái)計(jì)算這兩個(gè) map 中所有值的總和,并打印出結(jié)果。
這段代碼演示了 Go 語(yǔ)言中泛型的應(yīng)用,通過(guò)這個(gè)例子,我們可以更好地理解 Go 語(yǔ)言中的泛型功能。
如果不用泛型,我們可能要進(jìn)行多次復(fù)制粘貼,代碼不易維護(hù)。
如果不用類(lèi)型限制,一旦加入一個(gè)類(lèi)型,原有模塊也不易維護(hù)。
我們用類(lèi)型限制,也就是所謂的 type contract 達(dá)成一種共識(shí),大家一眼便知,這個(gè)和 interface 代表的接口特性是一個(gè)道理。
以上就是細(xì)細(xì)探究Go 泛型generic設(shè)計(jì)的詳細(xì)內(nèi)容,更多關(guān)于Go 泛型generic設(shè)計(jì)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解golang中發(fā)送http請(qǐng)求的幾種常見(jiàn)情況
這篇文章主要介紹了詳解golang中發(fā)送http請(qǐng)求的幾種常見(jiàn)情況,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12解決go語(yǔ)言ssh客戶端密碼過(guò)期問(wèn)題
這篇文章主要介紹了go語(yǔ)言ssh客戶端解決密碼過(guò)期問(wèn)題,本文給大家分享了解決的方法和原理,非常不錯(cuò),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04從Context到go設(shè)計(jì)理念輕松上手教程
這篇文章主要為大家介紹了從Context到go設(shè)計(jì)理念輕松上手教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09GoLang職責(zé)鏈模式代碼實(shí)現(xiàn)介紹
這篇文章主要介紹了GoLang職責(zé)鏈模式代碼實(shí)現(xiàn),職責(zé)鏈模式是一種常用的設(shè)計(jì)模式,可以提高代碼的靈活性與可維護(hù)性,職責(zé)鏈模式將請(qǐng)求和處理分離,可以讓請(qǐng)求在處理鏈中依次經(jīng)過(guò)多個(gè)處理者,直到找到能夠處理請(qǐng)求的處理者為止2023-05-05golang如何用type-switch判斷interface變量的實(shí)際存儲(chǔ)類(lèi)型
這篇文章主要介紹了golang如何用type-switch判斷interface變量的實(shí)際存儲(chǔ)類(lèi)型,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04執(zhí)行g(shù)o?build報(bào)錯(cuò)go:?go.mod?file?not?found?in?current?dir
本文主要為大家介紹了執(zhí)行g(shù)o build報(bào)錯(cuò)go:?go.mod?file?not?found?in?current?directory?or?any?parent?directory解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06