日前golang开发团队宣布正式发布了Go 1.18 Beta1,预计正式版本将在明年2月份发布。

作为一个bata预览版,目前可以用来测试要添加的语言最大变化go泛型。目前已经可以在官方下载频道下载:

泛型
Go 1.18 Beta 1是第一个包含Go对使用参数化类型的泛型代码的新支持。从Go 1 发布以来,泛型是Go最重要的变化,也是1.x版本之后给你带来的最大的单一语言更改。
泛型编程支持具有通用形式的结构函数和数据的表示,类型可以被分解。一个简单切片转序的例子来说明(参考子Russ Cox GopherCon 上演讲例子)
func ReverseInts(s []int) {
first := 0
last := len(s) - 1
for first < last {
s[first], s[last] = s[last], s[first]
first++
last--
}
}
反转一段字符串则需要另外写一个函数:
func ReverseStrings(s []string) {
first := 0
last := len(s) - 1
for first < last {
s[first], s[last] = s[last], s[first]
first++
last--
}
}
以上ReverseInts和ReverseStrings两个函数完全一样,只是参数的类型不同。但是在golang你必须要写两个函数。这样就显得非常繁琐,尤其是在处理多类似的应用时候,比如json时候,但是如果有泛型,问题就迎刃而解。
func Reverse (type Element) (s []Element) {
first := 0
last := len(s) - 1
for first < last {
s[first], s[last] = s[last], s[first]
first++
last--
}
}
然后调用
func ReverseAndPrint(s []int) {
Reverse(int)(s)
fmt.Println(s)
}
泛型版本的Revers函数可以处理任何类型的切片。需要做的唯一事情是对Element赋值,它适用于Golang中的任何类型。很多实例和文档可以参考golang泛型的设计搞文档。
示例
先决条件
Go1.18 Beta 1或更高版本的安装。
一种编辑代码的工具。任何文本编辑器都可以正常工作。
命令终端。 Go可以在Linux和Mac上的任何终端上以及Windows中的PowerShell或cmd运行良好,。
要安装Go1.18 Beta 1,可以使用下面的命令:
go install golang.org/dl/go1.18beta1@latest
运行以下命令下载更新。
go1.18beta1 download
通过go mod init命令创建一个示例工程:
go mod init example/generics
go: creating new go.mod: module example/generics
使用文本编辑器,在泛型目录工程中创建一个名为main.go的文件,撰写代码
package main
import "fmt"
func main() {
ints := map[string]int64{
"first": 34,
"second": 12,
}
floats := map[string]float64{
"first": 35.98,
"second": 26.99,
}
//调用非一般加法的两个函数
fmt.Printf("一般加法函数: %v %v\n",
SumInts(ints),
SumFloats(floats))
}
//调用泛型的加法
fmt.Printf("泛型加法: %v %v\n",
SumIntsOrFloats[string, int64](ints),
SumIntsOrFloats[string, float64](floats))
//并添加两个函数声明。
func SumInts(m map[string]int64) int64 {
var s int64
for _, v := range m {
s += v
}
return s
}
func SumFloats(m map[string]float64) float64 {
var s float64
for _, v := range m {
s += v
}
//泛型函数
func SumIntsOrFloats[K comparable, V int64 | float64](m map[K]V) V {
var s V
for _, v := range m {
s += v
}
return s
}
在main.go的目录中的命令行,运行代码。
go run .
一般加法函数结果: 46 62.97
泛型加法结果: 46 62.97
总结
由于泛型是个相对比较大的新功能,有一些bug和错误是难免的,所以在推出beta版本后,大家可以尝试自己的用例进行测试并提交反馈,希望在正式版本发布的时候是个稳定好用高性能的功能。