Go1.18都出泛型了速來圍觀
go泛型使用的官方說明:https://go.dev/doc/tutorial/generics
在使用之前先把go更新到1.18或者以上的版本:https://go.dev/doc/install
如果用過c++或者Java的話,那么對泛型這個概念應該是不陌生的。(下面這段定義摘抄自百度百科)
泛型程序設計(generic programming)是程序設計語言的一種風格或范式。泛型允許程序員在強類型程序設計語言中編寫代碼時使用一些以后才指定的類型,在實例化時作為參數(shù)指明這些類型。
我們可以用個簡單的例子來看看如何使用泛型。
在沒有泛型之前,如果我們要寫一個比較大小的函數(shù)的話,因為go里面沒有函數(shù)重載的概念,所以我們必須對需要比較的類型都創(chuàng)建一個比較函數(shù),不過這樣的話,就會有大量邏輯重復的代碼,他們的區(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預留了一個泛型,名為comparable,這是官方定義的一個可比較的類型約束
// 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是由所有可比較類型實現(xiàn)的接口
//(布爾、數(shù)字、字符串、指針、通道、類似類型的數(shù)組、,
//字段均為可比較類型的結(jié)構(gòu))。
//可比接口只能用作類型參數(shù)約束,
//不是作為變量的類型。
type comparable interface{ comparable }
我們可以來自己聲明一個類型約束。
type Number interface {
int | int32 | int64 | float32
}
如上定義表示如果參數(shù)類型要為int、int32、int64、float32這四個類型其中一個的適合,可以用Number替代。
所以我們可以把最初比較大小的代碼進行修改、簡化一下。
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ù)里面K就表示Number這個類型約束,然后可以用在函數(shù)的參數(shù)列表、函數(shù)體、返回值中。
加入需要用到以int或者float32等基本類型為基礎的類型時,例如type MyInt int,需要在類型名前面加上~
type Number interface {
~int
}
如果不加的話,使用時會出現(xiàn)如下錯誤提示
# generics-demo
.\main.go:23:23: MyInt does not implement Number (possibly missing ~ for int in constraint Number)
到此這篇關于Go1.18都出泛型了,不來試試看?的文章就介紹到這了,更多相關Go1.18泛型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Go Slice進行參數(shù)傳遞如何實現(xiàn)詳解
這篇文章主要為大家介紹了Go Slice進行參數(shù)傳遞如何實現(xiàn)的過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12

