終于來了!go tip已經(jīng)可以使用泛型了
我在二月份的文章利好!極大可能在go 1.17中就能嘗試泛型提到,雖然Go泛型會在Go 1.18中正式發(fā)布,但是因為各種原因,代碼已經(jīng)開始在master分支中實現(xiàn),所以極大可能你會在今年9月份發(fā)布的Go 1.17中就能嘗試使用Go泛型。
那么,現(xiàn)在,可以去掉"可能"這兩個字了。在Go 1.17可以確定的說你能夠嘗試Go泛型編程了,盡管建議你還是在Go 1.18以及以后的版本才正式在產(chǎn)品中使用泛型。
即使是現(xiàn)在,你也可以通過自己編譯master分支的方式,開始領(lǐng)略Go泛型的風采。
安裝
你可以通過下面的命令按照最新的master分支(Go項目中稱之為tip):
go get golang.org/dl/gotip
gotip download
gotip命令會clone最新的master并進行編譯,編譯完之后,你就是可以使用gotip命令了。在需要go執(zhí)行程序的時候,只需要換成gotip即可。
如果因為墻或者網(wǎng)絡(luò)的原因,你不能執(zhí)行上面的gotip download命令的話,你也可以直接git clone github上的go項目,執(zhí)行src下的make.bash文件,也可以編譯出go可執(zhí)行程序。
甚至你也可以結(jié)合這兩種方式,相信如果有些許的下載困難不會阻礙到你。
運行泛型例子
比如下面一個加法的泛型例子,定義了一個Addable的約束(constraint),也就是可以執(zhí)行加法的類型約束。然后實現(xiàn)了一個泛型方法add, 參數(shù)有兩個(a和b),類型是滿足Addable約束的類型,然后返回相加的結(jié)果。
package main
import (
"fmt"
)
type Addable interface {
type int, int8, int16, int32, int64,
uint, uint8, uint16, uint32, uint64, uintptr,
float32, float64, complex64, complex128,
string
}
func add[T Addable](a, b T able") T {
return a + b
}
func main() {
fmt.Println(add(1,2))
// FIXME
//fmt.Println(add("foo","bar"))
}
運行gotip build -gcflags=-G=3 main.go可以執(zhí)行這個文件,返回結(jié)果3。
Go語言中兩個字符串可以相加嗎?
"是的"! 字符串相加相當于concat,把兩個字符串連接起來,返回一個新的連接的字符串。按說,字符串也滿足Addable約束,但是你如果把倒數(shù)第二行的注釋去掉的話,這個程序是編譯不過的。
原因在于Go的泛型還在開發(fā)之中,里面肯定還有大大小小的問題,所以即使Go 1.17發(fā)布了,必然還得存在一些不完善得地方,更何況現(xiàn)在里發(fā)布Go 1.17還早呢。
更多得例子可以參照Yasuhiro Matsumoto的mattn/go-generics-example[1]項目,他提供十幾個泛型的例子,包括上面的add的例子。
如果你覺得好玩,不妨按照本文的安裝方法,試試Go的泛型的功能。
參考資料
mattn/go-generics-example: https://github.com/mattn/go-generics-example
推薦閱讀
