91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Golang泛型如何使用

發布時間:2022-06-17 13:50:34 來源:億速云 閱讀:166 作者:iii 欄目:開發技術

這篇文章主要介紹了Golang泛型如何使用的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Golang泛型如何使用文章都會有所收獲,下面我們一起來看看吧。

1. 泛型是什么

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

在比較兩個數的大小時,沒有泛型的時候,僅僅只是傳入類型不一樣,我們就要再寫一份一模一樣的函數,如果有了泛型就可以減少這類代碼

// 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. 泛型的簡單使用

2.1. 泛型示例

需要go版本大于等于1.18

我們先改造一下上面的示例,只需要在函數后用中括號聲明T可能出現的類型,中間用符號"|" 分隔

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

    return b
}

2.2. 自定義泛型類型

如果類型太多了怎么辦呢?這時候我們就可以自定義泛型類型

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

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

	return b
}

2.3. 調用帶泛型的函數

如何調用這個帶有泛型的函數呢?

var a int = 10
var b int = 20

// 方法1,正常調用,編譯器會自動推斷出傳入類型是int
GetMaxNum(a, b)

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

3. 自定義泛型類型的語法

在2.2小節中我們可以看到一個泛型的簡單自定義類型,本節將會詳細描述泛型自定義類型的語法

3.1. 內置的泛型類型any和comparable

any: 表示go里面所有的內置基本類型,等價于interface{}

Golang泛型如何使用

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

Golang泛型如何使用

3.2. 聲明一個自定義類型

跟聲明接口一樣,使用type x interface{} 關鍵字來聲明,不過里面的成員不再是方法,而是類型,類型之間用符號 "|" 隔開

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

成員類型支持go中所有的基本類型

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

3.3. 泛型中的"~"符號是什么

符號"~"都是與類型一起出現的,用來表示支持該類型的衍生類型

// int8的衍生類型
type int8A int8
type int8B = int8

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

4. 泛型的進階使用

4.1. 泛型與結構體

創建一個帶有泛型的結構體User,提供兩個獲取age和name的方法

注意:只有在結構體上聲明了泛型,結構體方法中才可以使用泛型

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
}

我們可以通過聲明結構體對象時,聲明泛型的類型來使用帶有泛型的結構體

// 聲明要使用的泛型的類型
var u User[int8, string]

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

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

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

5. 泛型的限制或缺陷

5.1 無法直接和switch配合使用

將泛型和switch配合使用時,無法通過編譯

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
}

關于“Golang泛型如何使用”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“Golang泛型如何使用”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

左贡县| 吴忠市| 榆树市| 鄯善县| 报价| 阳朔县| 枣阳市| 门源| 平潭县| 定州市| 屯门区| 宁阳县| 青海省| 绥滨县| 龙海市| 公安县| 遂宁市| 乐都县| 永昌县| 磴口县| 怀化市| 象州县| 青神县| 普宁市| 自贡市| 社旗县| 灌南县| 吉林市| 台安县| 德江县| 三门县| 焉耆| 闵行区| 永宁县| 永安市| 贵阳市| 京山县| 航空| 盖州市| 皋兰县| 万山特区|