Go1.18都出泛型了速來圍觀
go泛型使用的官方說明:https://go.dev/doc/tutorial/generics
在使用之前先把go更新到1.18或者以上的版本:https://go.dev/doc/install
如果用過c++或者Java的話,那么對泛型這個(gè)概念應(yīng)該是不陌生的。(下面這段定義摘抄自百度百科)
泛型程序設(shè)計(jì)(generic programming)是程序設(shè)計(jì)語言的一種風(fēng)格或范式。泛型允許程序員在強(qiáng)類型程序設(shè)計(jì)語言中編寫代碼時(shí)使用一些以后才指定的類型,在實(shí)例化時(shí)作為參數(shù)指明這些類型。
我們可以用個(gè)簡單的例子來看看如何使用泛型。
在沒有泛型之前,如果我們要寫一個(gè)比較大小的函數(shù)的話,因?yàn)間o里面沒有函數(shù)重載的概念,所以我們必須對需要比較的類型都創(chuàng)建一個(gè)比較函數(shù),不過這樣的話,就會(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 }
我們可以來自己聲明一個(gè)類型約束。
type Number interface {
int | int32 | int64 | float32
}
如上定義表示如果參數(shù)類型要為int、int32、int64、float32這四個(gè)類型其中一個(gè)的適合,可以用Number替代。
所以我們可以把最初比較大小的代碼進(jì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ù)名后面用在中括號中使用類型約束,這時(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都出泛型了,不來試試看?的文章就介紹到這了,更多相關(guān)Go1.18泛型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go利用反射reflect實(shí)現(xiàn)獲取接口變量信息
反射是通過實(shí)體對象獲取反射對象(Value、Type),然后可以操作相應(yīng)的方法。本文將利用Go語言中的反射reflect實(shí)現(xiàn)獲取接口變量信息,需要的可以參考一下2022-05-05
解決golang sync.Wait()不執(zhí)行的問題
這篇文章主要介紹了解決golang sync.Wait()不執(zhí)行的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
如何使用騰訊云go sdk 查詢對象存儲(chǔ)中最新文件
這篇文章主要介紹了使用騰訊云go sdk 查詢對象存儲(chǔ)中最新文件,這包括如何創(chuàng)建COS客戶端,如何逐頁檢索對象列表,并如何對結(jié)果排序以找到最后更新的對象,我們還展示了如何優(yōu)化用戶體驗(yàn),通過實(shí)時(shí)進(jìn)度更新和檢索多個(gè)文件來改進(jìn)程序,需要的朋友可以參考下2024-03-03

