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

golang泛型Generics的實(shí)現(xiàn)

 更新時(shí)間:2026年04月21日 09:28:05   作者:尼克  
本文主要介紹了golang泛型Generics的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

Go 泛型(Generics)自 Go 1.18(2022年3月)引入,允許編寫適用于多種類型的通用代碼,避免重復(fù)實(shí)現(xiàn)。以下是核心概念和使用指南:

1. 基本語法

泛型通過 類型參數(shù)(Type Parameters) 實(shí)現(xiàn),使用方括號(hào) [] 聲明:

// 泛型函數(shù):求最大值
func Max[T constraints.Ordered](slice []T) T {
    if len(slice) == 0 {
        var zero T
        return zero
    }
    max := slice[0]
    for _, v := range slice {
        if v > max {
            max = v
        }
    }
    return max
}
// 使用
ints := []int{1, 3, 2, 5, 4}
floats := []float64{1.1, 3.3, 2.2}
strings := []string{"apple", "banana"}
fmt.Println(Max(ints))    // 5
fmt.Println(Max(floats)) // 3.3
fmt.Println(Max(strings)) // "banana"

2. 類型約束(Constraints)

約束限制類型參數(shù)的范圍,常用約束來自 golang.org/x/exp/constraints 或標(biāo)準(zhǔn)庫:

約束含義適用類型
any任意類型所有類型
comparable可比較(==、!=)支持比較的類型
constraints.Ordered有序(可 <、> 比較)int, float, string 等
interface{ Method() }必須實(shí)現(xiàn)指定方法滿足接口的類型
// 自定義約束:必須支持 String() 方法
type Stringer interface {
    String() string
}
func PrintAll[T Stringer](items []T) {
    for _, item := range items {
        fmt.Println(item.String())
    }
}

3. 泛型數(shù)據(jù)結(jié)構(gòu)

泛型最常見的用途是實(shí)現(xiàn)通用數(shù)據(jù)結(jié)構(gòu),避免為每種類型重復(fù)編寫代碼:

// 泛型棧
type Stack[T any] struct {
    data []T
}
func (s *Stack[T]) Push(item T) {
    s.data = append(s.data, item)
}
func (s *Stack[T]) Pop() (T, error) {
    var zero T
    if len(s.data) == 0 {
        return zero, errors.New("stack is empty")
    }
    item := s.data[len(s.data)-1]
    s.data = s.data[:len(s.data)-1]
    return item, nil
}
// 使用
intStack := Stack[int]{}
strStack := Stack[string]{}

4. 何時(shí)使用泛型?(官方建議)

Go 泛型設(shè)計(jì)者 Ian Lance Taylor 給出的指導(dǎo)原則:

? 適合使用泛型

  • 通用數(shù)據(jù)結(jié)構(gòu):鏈表、樹、棧等(代碼與元素類型無關(guān))
  • 處理內(nèi)置容器:對(duì) slice、map、channel 進(jìn)行通用操作(如提取 map 的所有 key)
  • 不同類型實(shí)現(xiàn)相同邏輯:如 Len()Swap() 等方法實(shí)現(xiàn)完全一致
// 提取 map 的所有 key(與 value 類型無關(guān))
func MapKeys[Key comparable, Val any](m map[Key]Val) []Key {
    s := make([]Key, 0, len(m))
    for k := range m {
        s = append(s, k)
    }
    return s
}

? 不適合使用泛型

  • 僅調(diào)用方法時(shí):直接用 interface(如 io.Reader),不要寫成 func Read[T io.Reader](r T)
  • 不同實(shí)現(xiàn)邏輯時(shí):用接口+多態(tài),而非泛型(如文件讀取 vs 隨機(jī)數(shù)生成器的 Read
  • 為了性能優(yōu)化:泛型實(shí)例化后的代碼通常不會(huì)比 interface 更快

5. 重要陷阱與最佳實(shí)踐

避免指針類型作為類型參數(shù)

// ? 錯(cuò)誤:T 是類型參數(shù),不是指針,無法解引用
func Set[T *int|*uint](ptr T) { *ptr = 1 }
// ? 正確:明確使用 *T
func Set[T int|uint](ptr *T) { *ptr = 1 }

核心原則 

  • 從寫函數(shù)開始,發(fā)現(xiàn)重復(fù)代碼時(shí)再引入類型參數(shù),不要先定義約束
  • 優(yōu)先用函數(shù)而非方法:傳入 func(T, T) bool 比較函數(shù),比要求類型實(shí)現(xiàn) Compare() 方法更靈活
  • 明確使用 *T、[]T、map[K]V,不要讓 T 代表指針、slice 或 map 本身
  • 不要過度泛型化:如果接口(interface)能解決問題,就不要用泛型

6. 類型集合(Type Sets)

Go 1.18+ 支持使用 | 定義類型集合:

// 只接受 int 或 string
func Process[T int | string](val T) {
    fmt.Println(val)
}
// 結(jié)合接口約束
type Number interface {
    ~int | ~int64 | ~float64  // ~ 表示底層類型
}
func Sum[T Number](vals []T) T {
    var sum T
    for _, v := range vals {
        sum += v
    }
    return sum
}

~int 表示底層類型為 int 的所有類型(包括 type MyInt int 這種自定義類型)。

總結(jié):Go 泛型的設(shè)計(jì)哲學(xué)是 "用代碼寫程序,而不是用類型定義寫程序"。當(dāng)你發(fā)現(xiàn)自己在復(fù)制粘貼幾乎相同的代碼、只改類型時(shí),就是引入泛型的最佳時(shí)機(jī)。但 Go 的 interface 機(jī)制已經(jīng)非常強(qiáng)大,如果只是調(diào)用方法,優(yōu)先使用 interface 而非泛型。

到此這篇關(guān)于golang泛型Generics的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)golang泛型Generics內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang游戲等資源壓縮包創(chuàng)建和操作方法

    golang游戲等資源壓縮包創(chuàng)建和操作方法

    這篇文章主要介紹了golang游戲等資源壓縮包創(chuàng)建和操作,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-08-08
  • Go語言實(shí)現(xiàn)猜數(shù)字小游戲

    Go語言實(shí)現(xiàn)猜數(shù)字小游戲

    這篇文章主要為大家詳細(xì)介紹了Go語言實(shí)現(xiàn)猜數(shù)字小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • Go系列教程之反射的用法

    Go系列教程之反射的用法

    這篇文章主要介紹了Go系列教程之反射的用法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2019-01-01
  • go語言使用scp的方法實(shí)例分析

    go語言使用scp的方法實(shí)例分析

    這篇文章主要介紹了go語言使用scp的方法,實(shí)例分析了go語言調(diào)用scp命令的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-03-03
  • GO語言中接口和接口型函數(shù)的具體使用

    GO語言中接口和接口型函數(shù)的具體使用

    本文主要介紹了GO語言中接口和接口型函數(shù)的使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Go語言中切片展開操作符的實(shí)現(xiàn)示例

    Go語言中切片展開操作符的實(shí)現(xiàn)示例

    在Go語言編程中,我們經(jīng)常會(huì)遇到處理多維切片數(shù)據(jù)的場景,今天我們來深入探討一個(gè)非常實(shí)用但容易被忽視的語法特性-切片展開操作符,感興趣的可以了解一下
    2025-10-10
  • Golang使用Apache PLC4X連接modbus的示例代碼

    Golang使用Apache PLC4X連接modbus的示例代碼

    Modbus是一種串行通信協(xié)議,是Modicon公司于1979年為使用可編程邏輯控制器(PLC)通信而發(fā)表,這篇文章主要介紹了Golang使用Apache PLC4X連接modbus的示例代碼,需要的朋友可以參考下
    2024-07-07
  • 教你一招完美解決vscode安裝go插件失敗問題

    教你一招完美解決vscode安裝go插件失敗問題

    VSCode是我們開發(fā)go程序的常用工具,但是安裝VSCode成功后,創(chuàng)建一個(gè).go文件居然提示錯(cuò)誤了,所以下面下面這篇文章主要給大家介紹了如何通過一招完美解決vscode安裝go插件失敗問題的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • Go中sync.Mutex 加鎖失效的問題解決

    Go中sync.Mutex 加鎖失效的問題解決

    sync.Mutex是Go標(biāo)準(zhǔn)庫中常用的一個(gè)排外鎖,本文主要介紹了Go中sync.Mutex 加鎖失效的問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • gorm update傳入struct對(duì)象,零值字段不更新的解決方案

    gorm update傳入struct對(duì)象,零值字段不更新的解決方案

    這篇文章主要介紹了gorm update傳入struct對(duì)象,零值字段不更新的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04

最新評(píng)論

祥云县| 宁阳县| 富川| 灵寿县| 桓仁| 犍为县| 万荣县| 正定县| 定日县| 买车| 三明市| 黄石市| 班戈县| 曲周县| 新干县| 元江| 杂多县| 陵水| 仁化县| 炎陵县| 涿鹿县| 静宁县| 利川市| 玛纳斯县| 陆河县| 大兴区| 榆中县| 偃师市| 岢岚县| 金乡县| 玛多县| 襄城县| 长沙县| 康马县| 山丹县| 揭西县| 尖扎县| 黄骅市| 漳州市| 云浮市| 广水市|