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

Golang泛型的使用方法詳解

 更新時(shí)間:2022年06月17日 11:33:39   作者:doublewe  
這篇文章主要介紹了Golang中泛型的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

1. 泛型是什么

泛型生命周期只在編譯期,旨在為程序員生成代碼,減少重復(fù)代碼的編寫(xiě)

在比較兩個(gè)數(shù)的大小時(shí),沒(méi)有泛型的時(shí)候,僅僅只是傳入類(lèi)型不一樣,我們就要再寫(xiě)一份一模一樣的函數(shù),如果有了泛型就可以減少這類(lèi)代碼

// int
func GetMaxNumInt(a, b int) int {
	if a > b {
		return a
	}

	return b
}

// int8
func GetMaxNumInt8(a, b int8) int8 {
	if a > b {
		return a
	}

	return b
}

2. 泛型的簡(jiǎn)單使用

2.1. 泛型示例

需要go版本大于等于1.18

我們先改造一下上面的示例,只需要在函數(shù)后用中括號(hào)聲明T可能出現(xiàn)的類(lèi)型,中間用符號(hào)"|" 分隔

// 使用泛型
func GetMaxNum[T int | int8](a, b T) T {
    if a > b {
        return a
    }

    return b
}

2.2. 自定義泛型類(lèi)型

如果類(lèi)型太多了怎么辦呢?這時(shí)候我們就可以自定義泛型類(lèi)型

// 像聲明接口一樣聲明
type MyInt interface {
	int | int8 | int16 | int32 | int64
}

// T的類(lèi)型為聲明的MyInt
func GetMaxNum[T MyInt](a, b T) T {
	if a > b {
		return a
	}

	return b
}

2.3. 調(diào)用帶泛型的函數(shù)

如何調(diào)用這個(gè)帶有泛型的函數(shù)呢?

var a int = 10
var b int = 20

// 方法1,正常調(diào)用,編譯器會(huì)自動(dòng)推斷出傳入類(lèi)型是int
GetMaxNum(a, b)

// 方法2,顯式告訴函數(shù)傳入的類(lèi)型是int
GetMaxNum[int](a, b)

3. 自定義泛型類(lèi)型的語(yǔ)法

在2.2小節(jié)中我們可以看到一個(gè)泛型的簡(jiǎn)單自定義類(lèi)型,本節(jié)將會(huì)詳細(xì)描述泛型自定義類(lèi)型的語(yǔ)法

3.1. 內(nèi)置的泛型類(lèi)型any和comparable

any: 表示go里面所有的內(nèi)置基本類(lèi)型,等價(jià)于interface{}

comparable: 表示go里面所有內(nèi)置的可比較類(lèi)型:int、uint、float、bool、struct、指針等一切可以比較的類(lèi)型

3.2. 聲明一個(gè)自定義類(lèi)型

跟聲明接口一樣,使用type x interface{} 關(guān)鍵字來(lái)聲明,不過(guò)里面的成員不再是方法,而是類(lèi)型,類(lèi)型之間用符號(hào) "|" 隔開(kāi)

type MyInt interface {
    int | int8 | int16 | int32 | int64
}

成員類(lèi)型支持go中所有的基本類(lèi)型

type MyT interface {
    int | float32 | bool | chan int | map[int]int | [10]int | []int | struct{} | *http.Client
}

3.3. 泛型中的"~"符號(hào)是什么

符號(hào)"~"都是與類(lèi)型一起出現(xiàn)的,用來(lái)表示支持該類(lèi)型的衍生類(lèi)型

// int8的衍生類(lèi)型
type int8A int8
type int8B = int8

// 不僅支持int8, 還支持int8的衍生類(lèi)型int8A和int8B
type MyInt interface {
	~int8
}

4. 泛型的進(jìn)階使用

4.1. 泛型與結(jié)構(gòu)體

創(chuàng)建一個(gè)帶有泛型的結(jié)構(gòu)體User,提供兩個(gè)獲取age和name的方法

注意:只有在結(jié)構(gòu)體上聲明了泛型,結(jié)構(gòu)體方法中才可以使用泛型

type AgeT interface {
	int8 | int16
}

type NameE interface {
	string
}

type User[T AgeT, E NameE] struct {
	age  T
	name E
}

// 獲取age
func (u *User[T, E]) GetAge() T {
	return u.age
}


// 獲取name
func (u *User[T, E]) GetName() E {
	return u.name
}

我們可以通過(guò)聲明結(jié)構(gòu)體對(duì)象時(shí),聲明泛型的類(lèi)型來(lái)使用帶有泛型的結(jié)構(gòu)體

// 聲明要使用的泛型的類(lèi)型
var u User[int8, string]

// 賦值
u.age = 18
u.name = "weiwei"

// 調(diào)用方法
age := u.GetAge()
name := u.GetName()

// 輸出結(jié)果 18 weiwei
fmt.Println(age, name) 

5. 泛型的限制或缺陷

5.1 無(wú)法直接和switch配合使用

將泛型和switch配合使用時(shí),無(wú)法通過(guò)編譯

func Get[T any]() T {
	var t T

	switch T {
	case int:
		t = 18
	}

	return t
}

只能先將泛型賦值給interface才可以和switch配合使用

func Get[T any]() T {
	var t T

	var ti interface{} = &t
	switch v := ti.(type) {
	case *int:
		*v = 18
	}

	return t
}

到此這篇關(guān)于Golang泛型的使用方法詳解的文章就介紹到這了,更多相關(guān)Golang泛型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go語(yǔ)言學(xué)習(xí)之函數(shù)的定義與使用詳解

    Go語(yǔ)言學(xué)習(xí)之函數(shù)的定義與使用詳解

    這篇文章主要為大家詳細(xì)介紹Go語(yǔ)言中函數(shù)的定義與使用,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Go語(yǔ)言有一定幫助,需要的可以參考一下
    2022-04-04
  • Go/C語(yǔ)言LeetCode題解997找到小鎮(zhèn)法官

    Go/C語(yǔ)言LeetCode題解997找到小鎮(zhèn)法官

    這篇文章主要為大家介紹了Go語(yǔ)言LeetCode題解997找到小鎮(zhèn)的法官示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Go語(yǔ)言帶緩沖的通道實(shí)現(xiàn)

    Go語(yǔ)言帶緩沖的通道實(shí)現(xiàn)

    這篇文章主要介紹了Go語(yǔ)言帶緩沖的通道實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Go實(shí)現(xiàn)一個(gè)配置包詳解

    Go實(shí)現(xiàn)一個(gè)配置包詳解

    在現(xiàn)代軟件開(kāi)發(fā)中,配置文件是不可或缺的一部分。在編寫(xiě) Go 項(xiàng)目時(shí),程序的靈活性和可擴(kuò)展性都需要依賴于配置文件的加載。本文就來(lái)探究下在 Go 項(xiàng)目中如何更加方便的加載和管理配置,感興趣的朋友跟著小編一起來(lái)學(xué)習(xí)吧
    2023-04-04
  • golang簡(jiǎn)易令牌桶算法實(shí)現(xiàn)代碼

    golang簡(jiǎn)易令牌桶算法實(shí)現(xiàn)代碼

    這篇文章主要介紹了golang簡(jiǎn)易令牌桶算法實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Go語(yǔ)言輕量級(jí)線程Goroutine用法實(shí)例

    Go語(yǔ)言輕量級(jí)線程Goroutine用法實(shí)例

    這篇文章主要介紹了Go語(yǔ)言輕量級(jí)線程Goroutine用法,實(shí)例分析了goroutine使用技巧,需要的朋友可以參考下
    2015-02-02
  • golang抓取tcp包的實(shí)現(xiàn)方式

    golang抓取tcp包的實(shí)現(xiàn)方式

    使用`golang`的`packet`和`pcap`庫(kù)可以抓取TCP數(shù)據(jù)包,首先,確保安裝了`pcap`庫(kù),然后使用以下代碼打開(kāi)網(wǎng)絡(luò)接口,設(shè)置過(guò)濾規(guī)則為“tcp”,開(kāi)始捕獲并解析TCP數(shù)據(jù)包,運(yùn)行代碼時(shí)需要管理員權(quán)限
    2024-12-12
  • Go語(yǔ)言讀取,設(shè)置Cookie及設(shè)置cookie過(guò)期方法詳解

    Go語(yǔ)言讀取,設(shè)置Cookie及設(shè)置cookie過(guò)期方法詳解

    這篇文章主要介紹了Go語(yǔ)言讀取,設(shè)置Cookie及設(shè)置cookie過(guò)期方法詳解,需要的朋友可以參考下
    2022-04-04
  • Go語(yǔ)言中ORM框架GORM使用介紹

    Go語(yǔ)言中ORM框架GORM使用介紹

    GORM是Go語(yǔ)言中最受歡迎的ORM庫(kù)之一,它提供了強(qiáng)大的功能和簡(jiǎn)潔的?API,讓數(shù)據(jù)庫(kù)操作變得更加簡(jiǎn)單和易維護(hù),本文將詳細(xì)介紹GORM的常見(jiàn)用法,包括數(shù)據(jù)庫(kù)連接、模型定義、CRUD、事務(wù)管理等方面,幫助大家快速上手使用GORM進(jìn)行Web后端開(kāi)發(fā)
    2023-06-06
  • Go實(shí)現(xiàn)自動(dòng)解壓縮包以及讀取docx/doc文件內(nèi)容詳解

    Go實(shí)現(xiàn)自動(dòng)解壓縮包以及讀取docx/doc文件內(nèi)容詳解

    在開(kāi)發(fā)過(guò)程中,我們常常需要處理壓縮包和文檔文件。本文將介紹如何使用Go語(yǔ)言自動(dòng)解壓縮包和讀取docx/doc文件,需要的可以參考一下
    2023-03-03

最新評(píng)論

宁晋县| 南投县| 乌拉特后旗| 新宾| 安多县| 西盟| 清新县| 巴彦县| 金平| 东光县| 临武县| 苗栗县| 北辰区| 绥滨县| 淄博市| 阿图什市| 平阳县| 喀什市| 黎城县| 赤城县| 临洮县| 砀山县| 杭锦后旗| 林甸县| 凌海市| 行唐县| 美姑县| 万盛区| 武陟县| 阿克| 汉川市| 邢台市| 诏安县| 永宁县| 梧州市| 墨玉县| 江陵县| 福海县| 枣庄市| 武冈市| 南溪县|