亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

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)型的值。接著,代碼使用非泛型的 SumIntsSumFloats 函數(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中的強(qiáng)大Web框架Fiber詳解

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

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

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

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

    Go語(yǔ)言中常量定義方法實(shí)例分析

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

    解決go語(yǔ)言ssh客戶端密碼過(guò)期問(wèn)題

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

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

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

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

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

    GoLang職責(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-05
  • golang如何用type-switch判斷interface變量的實(shí)際存儲(chǔ)類(lèi)型

    golang如何用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?directory?or?any?parent?directory

    執(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

最新評(píng)論