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

Go1.18都出泛型了速來(lái)圍觀

 更新時(shí)間:2022年03月17日 14:12:34   作者:jiangxiaoju  
泛型允許程序員在強(qiáng)類型程序設(shè)計(jì)語(yǔ)言中編寫代碼時(shí)使用一些以后才指定的類型,在實(shí)例化時(shí)作為參數(shù)指明這些類型,本文通過(guò)例子給大家介紹下如何使用泛型,對(duì)Go1.18泛型相關(guān)知識(shí)感興趣的朋友一起看看吧

go泛型使用的官方說(shuō)明:https://go.dev/doc/tutorial/generics

在使用之前先把go更新到1.18或者以上的版本:https://go.dev/doc/install

如果用過(guò)c++或者Java的話,那么對(duì)泛型這個(gè)概念應(yīng)該是不陌生的。(下面這段定義摘抄自百度百科)
泛型程序設(shè)計(jì)(generic programming)是程序設(shè)計(jì)語(yǔ)言的一種風(fēng)格或范式。泛型允許程序員在強(qiáng)類型程序設(shè)計(jì)語(yǔ)言中編寫代碼時(shí)使用一些以后才指定的類型,在實(shí)例化時(shí)作為參數(shù)指明這些類型。

我們可以用個(gè)簡(jiǎn)單的例子來(lái)看看如何使用泛型。

在沒(méi)有泛型之前,如果我們要寫一個(gè)比較大小的函數(shù)的話,因?yàn)間o里面沒(méi)有函數(shù)重載的概念,所以我們必須對(duì)需要比較的類型都創(chuàng)建一個(gè)比較函數(shù),不過(guò)這樣的話,就會(huì)有大量邏輯重復(fù)的代碼,他們的區(qū)別只是變量的類型不同罷了。

package main

import "fmt"
func MaxInt(a, b int) int {
	if a > b {
		return a
	} else {
		return b
	}
}
func MaxFloat32(a, b float32) float32 {
func main() {
	var a, b int
	var c, d float32
	a = 1
	b = 2
	c = 1.1
	d = 1.4
	fmt.Println(MaxInt(a, b))
	fmt.Println(MaxFloat32(c, d))

那么泛型該如何使用呢?
go預(yù)留了一個(gè)泛型,名為comparable,這是官方定義的一個(gè)可比較的類型約束

// comparable is an interface that is implemented by all comparable types
// (booleans, numbers, strings, pointers, channels, arrays of comparable types,
// structs whose fields are all comparable types).
// The comparable interface may only be used as a type parameter constraint,
// not as the type of a variable.
//翻譯如下
//comparable是由所有可比較類型實(shí)現(xiàn)的接口
//(布爾、數(shù)字、字符串、指針、通道、類似類型的數(shù)組、,
//字段均為可比較類型的結(jié)構(gòu))。
//可比接口只能用作類型參數(shù)約束,
//不是作為變量的類型。
type comparable interface{ comparable }

我們可以來(lái)自己聲明一個(gè)類型約束。

type Number interface {
	int | int32 | int64 | float32
}

如上定義表示如果參數(shù)類型要為int、int32、int64float32這四個(gè)類型其中一個(gè)的適合,可以用Number替代。
所以我們可以把最初比較大小的代碼進(jìn)行修改、簡(jiǎn)化一下。

package main

import "fmt"
type Number interface {
	int | int32 | int64 | float32
}
func MaxNumber[K Number](a K, b K) K {
	if a > b {
		return a
	} else {
		return b
	}
func main() {
	var a, b int
	var c, d float32
	a = 1
	b = 2
	c = 1.1
	d = 1.4
	fmt.Println(MaxNumber(a, b))
	fmt.Println(MaxNumber(c, d))

在函數(shù)名后面用在中括號(hào)中使用類型約束,這時(shí)候在函數(shù)里面K就表示Number這個(gè)類型約束,然后可以用在函數(shù)的參數(shù)列表、函數(shù)體、返回值中。

加入需要用到以int或者float32等基本類型為基礎(chǔ)的類型時(shí),例如type MyInt int,需要在類型名前面加上~

type Number interface {
 	~int   
}

如果不加的話,使用時(shí)會(huì)出現(xiàn)如下錯(cuò)誤提示

# generics-demo
.\main.go:23:23: MyInt does not implement Number (possibly missing ~ for int in constraint Number)

到此這篇關(guān)于Go1.18都出泛型了,不來(lái)試試看?的文章就介紹到這了,更多相關(guān)Go1.18泛型內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go利用反射reflect實(shí)現(xiàn)獲取接口變量信息

    Go利用反射reflect實(shí)現(xiàn)獲取接口變量信息

    反射是通過(guò)實(shí)體對(duì)象獲取反射對(duì)象(Value、Type),然后可以操作相應(yīng)的方法。本文將利用Go語(yǔ)言中的反射reflect實(shí)現(xiàn)獲取接口變量信息,需要的可以參考一下
    2022-05-05
  • Go uuid庫(kù)的具體使用

    Go uuid庫(kù)的具體使用

    在現(xiàn)代軟件開(kāi)發(fā)中,全球唯一標(biāo)識(shí)符(UUID)在許多場(chǎng)景中發(fā)揮著重要的作用,本文主要介紹了Go uuid庫(kù)的具體使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-11-11
  • Go語(yǔ)言中如何實(shí)現(xiàn)并發(fā)

    Go語(yǔ)言中如何實(shí)現(xiàn)并發(fā)

    Go的并發(fā)機(jī)制通過(guò)協(xié)程和通道的簡(jiǎn)單性和高效性,使得編寫并發(fā)代碼變得相對(duì)容易,這種并發(fā)模型被廣泛用于構(gòu)建高性能的網(wǎng)絡(luò)服務(wù)、并行處理任務(wù)和其他需要有效利用多核處理器的應(yīng)用程序,這篇文章主要介紹了在Go中如何實(shí)現(xiàn)并發(fā),需要的朋友可以參考下
    2023-09-09
  • 解決golang sync.Wait()不執(zhí)行的問(wèn)題

    解決golang sync.Wait()不執(zhí)行的問(wèn)題

    這篇文章主要介紹了解決golang sync.Wait()不執(zhí)行的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • 重學(xué)Go語(yǔ)言之如何使用Redis

    重學(xué)Go語(yǔ)言之如何使用Redis

    Redis是我們開(kāi)發(fā)應(yīng)用程序中很常用的NoSQL數(shù)據(jù)庫(kù),那么在Go語(yǔ)言中要如何連接和操作Redis呢,在這篇文章中,我們就來(lái)一起來(lái)探究一下吧
    2023-08-08
  • 如何使用騰訊云go sdk 查詢對(duì)象存儲(chǔ)中最新文件

    如何使用騰訊云go sdk 查詢對(duì)象存儲(chǔ)中最新文件

    這篇文章主要介紹了使用騰訊云go sdk 查詢對(duì)象存儲(chǔ)中最新文件,這包括如何創(chuàng)建COS客戶端,如何逐頁(yè)檢索對(duì)象列表,并如何對(duì)結(jié)果排序以找到最后更新的對(duì)象,我們還展示了如何優(yōu)化用戶體驗(yàn),通過(guò)實(shí)時(shí)進(jìn)度更新和檢索多個(gè)文件來(lái)改進(jìn)程序,需要的朋友可以參考下
    2024-03-03
  • GO語(yǔ)言的數(shù)組array與切片slice詳解

    GO語(yǔ)言的數(shù)組array與切片slice詳解

    這篇文章主要介紹了GO語(yǔ)言的數(shù)組array與切片slice,包括了GO語(yǔ)言數(shù)組定義賦值,GO語(yǔ)言多維數(shù)組,GO語(yǔ)言切片等知識(shí)點(diǎn)需要的朋友可以參考下
    2022-12-12
  • go同步原語(yǔ)Phaser和Barrier區(qū)別

    go同步原語(yǔ)Phaser和Barrier區(qū)別

    這篇文章主要為大家介紹了通過(guò)java講解go同步原語(yǔ)Phaser和Barrier區(qū)別,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Go語(yǔ)言中匿名嵌套和類型嵌套的區(qū)別解析

    Go語(yǔ)言中匿名嵌套和類型嵌套的區(qū)別解析

    在Go語(yǔ)言中,匿名嵌套結(jié)構(gòu)體和與類型同名的嵌套結(jié)構(gòu)體不是完全等價(jià)的,它們有一些重要的區(qū)別,這篇文章主要介紹了Go語(yǔ)言中匿名嵌套和類型嵌套的區(qū)別,需要的朋友可以參考下
    2023-09-09
  • 一文介紹Go語(yǔ)言中的指針

    一文介紹Go語(yǔ)言中的指針

    指針是一個(gè)存儲(chǔ)變量?jī)?nèi)存地址的變量,本文主要介紹了Go語(yǔ)言中的指針,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10

最新評(píng)論