欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

細(xì)細(xì)探究Go 泛型generic設(shè)計

 更新時間:2023年04月12日 16:35:52   作者:TPEngineer  
這篇文章主要帶大家細(xì)細(xì)探究了Go 泛型generic設(shè)計及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

Go 泛型

的設(shè)計融入了現(xiàn)代語言的風(fēng)格,比如類型限制(type constraint),我們在 TypeScript 和 Python 也能看到這個特性。

今天我就好好品味一下這個泛型設(shè)計,和老版本的 Go 做一個對比,并且加入類型限制的例子。

demo

直接進(jìn)入正題:

package main
import "fmt"
// 代碼中首先定義了一個接口類型 `Number`,
// 它包含了兩個類型:`int64` 和 `float64`。
// 這個接口類型可以被用來限制泛型函數(shù)的類型參數(shù)范圍。
type Number interface {
    int64 | float64
}
// 定義了兩個非泛型函數(shù) `SumInts` 和 `SumFloats`,
// 它們分別用于計算 `int64` 類型和 `float64` 類型的 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
}
// 定義了一個泛型函數(shù) `SumIntsOrFloats`,它接受一個類型為 `map[K]V` 的 map,并返回這個 map 中所有值的總和。
// 這個函數(shù)使用了兩個類型參數(shù) `K` 和 `V`,其中 `V` 的類型可以是 `int64` 或 `float64` 中的一個。
// 函數(shù)中使用了 `for range` 語句來遍歷 map 中的值并計算它們的總和,最終返回這個總和。
// 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`,它的類型參數(shù) `V` 必須實現(xiàn) `Number` 接口類型。
// 這個函數(shù)和 `SumIntsOrFloats` 函數(shù)類似,不同之處在于它使用了 `Number` 接口類型來限制 `V` 的取值范圍
// 只有實現(xiàn)了 `Number` 接口類型的類型才能作為 `V` 的值類型。
// 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ù)中,代碼初始化了兩個 map,分別用于存儲 int64 類型和 float64 類型的值。接著,代碼使用非泛型的 SumIntsSumFloats 函數(shù)來計算這兩個 map 中所有值的總和,并打印出結(jié)果。然后,代碼使用泛型的 SumIntsOrFloats 函數(shù)來計算這兩個 map 中所有值的總和,并打印出結(jié)果。最后,代碼使用帶有類型約束的泛型函數(shù) SumNumbers 來計算這兩個 map 中所有值的總和,并打印出結(jié)果。

這段代碼演示了 Go 語言中泛型的應(yīng)用,通過這個例子,我們可以更好地理解 Go 語言中的泛型功能。

如果不用泛型,我們可能要進(jìn)行多次復(fù)制粘貼,代碼不易維護(hù)。

如果不用類型限制,一旦加入一個類型,原有模塊也不易維護(hù)。

我們用類型限制,也就是所謂的 type contract 達(dá)成一種共識,大家一眼便知,這個和 interface 代表的接口特性是一個道理。

以上就是細(xì)細(xì)探究Go 泛型generic設(shè)計的詳細(xì)內(nèi)容,更多關(guān)于Go 泛型generic設(shè)計的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Golang中的強(qiáng)大Web框架Fiber詳解

    Golang中的強(qiáng)大Web框架Fiber詳解

    在不斷發(fā)展的Web開發(fā)領(lǐng)域中,選擇正確的框架可以極大地影響項目的效率和成功,介紹一下Fiber,這是一款令人印象深刻的Golang(Go語言)Web框架,在本文中,我們將深入了解Fiber的世界,探討其獨(dú)特的特性,并理解為什么它在Go生態(tài)系統(tǒng)中引起了如此大的關(guān)注
    2023-10-10
  • 詳解golang中發(fā)送http請求的幾種常見情況

    詳解golang中發(fā)送http請求的幾種常見情況

    這篇文章主要介紹了詳解golang中發(fā)送http請求的幾種常見情況,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • RoaringBitmap原理及在Go中的使用詳解

    RoaringBitmap原理及在Go中的使用詳解

    這篇文章主要為大家介紹了RoaringBitmap原理及在Go中的使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Go語言中常量定義方法實例分析

    Go語言中常量定義方法實例分析

    這篇文章主要介紹了Go語言中常量定義方法,以實例形式分析了Go語言中常量的定義及使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • 解決go語言ssh客戶端密碼過期問題

    解決go語言ssh客戶端密碼過期問題

    這篇文章主要介紹了go語言ssh客戶端解決密碼過期問題,本文給大家分享了解決的方法和原理,非常不錯,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-04-04
  • golang中tar壓縮和解壓文件詳情

    golang中tar壓縮和解壓文件詳情

    這篇文章主要給大家介紹golang中tar壓縮和解壓文件,文章以查看官方文檔自帶的給大家演習(xí)一下golang的archive/tar壓縮和解壓功能,需要的朋友可以參考一下
    2021-11-11
  • 從Context到go設(shè)計理念輕松上手教程

    從Context到go設(shè)計理念輕松上手教程

    這篇文章主要為大家介紹了從Context到go設(shè)計理念輕松上手教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • GoLang職責(zé)鏈模式代碼實現(xiàn)介紹

    GoLang職責(zé)鏈模式代碼實現(xiàn)介紹

    這篇文章主要介紹了GoLang職責(zé)鏈模式代碼實現(xiàn),職責(zé)鏈模式是一種常用的設(shè)計模式,可以提高代碼的靈活性與可維護(hù)性,職責(zé)鏈模式將請求和處理分離,可以讓請求在處理鏈中依次經(jīng)過多個處理者,直到找到能夠處理請求的處理者為止
    2023-05-05
  • golang如何用type-switch判斷interface變量的實際存儲類型

    golang如何用type-switch判斷interface變量的實際存儲類型

    這篇文章主要介紹了golang如何用type-switch判斷interface變量的實際存儲類型,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • 執(zhí)行g(shù)o?build報錯go:?go.mod?file?not?found?in?current?directory?or?any?parent?directory

    執(zhí)行g(shù)o?build報錯go:?go.mod?file?not?found?in?current?dir

    本文主要為大家介紹了執(zhí)行g(shù)o build報錯go:?go.mod?file?not?found?in?current?directory?or?any?parent?directory解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06

最新評論