最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

細細探究Go 泛型generic設計

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

Go 泛型

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

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

demo

直接進入正題:

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 中所有值的總和,并打印出結果。然后,代碼使用泛型的 SumIntsOrFloats 函數(shù)來計算這兩個 map 中所有值的總和,并打印出結果。最后,代碼使用帶有類型約束的泛型函數(shù) SumNumbers 來計算這兩個 map 中所有值的總和,并打印出結果。

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

如果不用泛型,我們可能要進行多次復制粘貼,代碼不易維護。

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

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

以上就是細細探究Go 泛型generic設計的詳細內容,更多關于Go 泛型generic設計的資料請關注腳本之家其它相關文章!

相關文章

  • Golang解析yaml文件操作指南

    Golang解析yaml文件操作指南

    之前一直從事java開發(fā),習慣了使用yaml文件的格式,尤其是清晰的層次結構、注釋,下面這篇文章主要給大家介紹了關于Golang解析yaml文件的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • GPT回答:go語言和C語言切片對比

    GPT回答:go語言和C語言切片對比

    這篇文章主要為大家介紹了GPT回答:go語言和C語言切片對比,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • go開發(fā)中引用靜態(tài)庫.a文件的方法

    go開發(fā)中引用靜態(tài)庫.a文件的方法

    這篇文章主要介紹了go開發(fā)中引用靜態(tài)庫.a文件的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • Golang的性能優(yōu)化和調試技巧

    Golang的性能優(yōu)化和調試技巧

    在開發(fā)和部署Go語言應用程序時,性能優(yōu)化和調試是至關重要的,篇博客將介紹一些常用的Golang性能優(yōu)化和調試技巧,幫助您提升應用程序的性能并解決潛在的問題
    2023-05-05
  • go語言的panic和recover函數(shù)用法實例

    go語言的panic和recover函數(shù)用法實例

    今天小編就為大家分享一篇關于go語言的panic和recover函數(shù)用法實例,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • Go語言中validation庫不能校驗零值問題的解決方法

    Go語言中validation庫不能校驗零值問題的解決方法

    在使用 Gin 框架的時候,前后端傳遞數(shù)據(jù)的時候,比如使用 JSON 格式,通常會使用 ShouldBindJSON 去用結構體打 tag 綁定前端傳來的 JSON 格式數(shù)據(jù),本文給大家介紹了Go語言中validation庫不能校驗零值問題的解決方法,需要的朋友可以參考下
    2024-08-08
  • 創(chuàng)建Go工程化項目布局詳解

    創(chuàng)建Go工程化項目布局詳解

    這篇文章主要介紹了創(chuàng)建Go工程化項目布局詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • Go語言框架快速集成限流中間件詳解

    Go語言框架快速集成限流中間件詳解

    這篇文章主要為大家介紹了Go語言框架快速集成限流中間件詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • 基于微服務框架go-micro開發(fā)gRPC應用程序

    基于微服務框架go-micro開發(fā)gRPC應用程序

    這篇文章介紹了基于微服務框架go-micro開發(fā)gRPC應用程序的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • Go語言LeetCode題解937重新排列日志文件

    Go語言LeetCode題解937重新排列日志文件

    這篇文章主要為大家介紹了Go語言LeetCode題解937重新排列日志文件,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12

最新評論

邹城市| 上饶市| 宜城市| 乌兰察布市| 桐庐县| 铜川市| 阿荣旗| 瓦房店市| 红河县| 深泽县| 五原县| 雷山县| 绥江县| 阳谷县| 蕉岭县| 安陆市| 武清区| 商河县| 香港| 阳江市| 宜州市| 肥城市| 顺平县| 长沙县| 牙克石市| 溧阳市| 贵定县| 麟游县| 宁夏| 神池县| 濮阳县| 乡城县| 历史| 枞阳县| 天等县| 临夏县| 塔河县| 余江县| 三明市| 合肥市| 武平县|