Go1.18来了

美国时间 2022年3月16日 Go 1.18 版本正式发布。这个版本比之前基本版本多用了一个月左右时间,也是近期最重要的一个版本,因为范型终于来了。


一、Go 1.18 变化快览

- 范型(Generics)

关于范型的早在2019年的GopherCon,Taylor就有一场关于范型的演讲,文字稿 https://go.dev/blog/why-generics
范型来了,让Gopher有了更多可能,对于一些无范型经验的开发其实可以忽略,毕竟毕竟范型对于CRUD项目开发效率提升的影响基本可忽略。

- 模糊测试(Fuzzing)

早期做Web开发,我经常使用JMeter做一个随机参数构造,写Go之后也经常在Benchmark中使用math.rand生成一些随机数做方法/压力测试。go fuzz被集成在testing.F 下,简单看了下Demo 使用还是比较方便。更多内容参照文章结尾链接 ⬇️。

- 工作区(WorkSpace)

工作区是对go mod一个优化。使用go module模式编程引用本地mod有两个方式:1、提交被引用项目到仓库,更新go.mod引用最新的CommitID或者TagID。2、飞线, replace mod 到本地路径,当然这种方法最大的问题是CI就不太方便了。

- 其他重要的变更项目

    1. go mod vender 支持修改路径
    1. httpclient禁用 tls1.0 tls1.1
    1. 默认x509不信任SHA-1签名的证书

二、再说说范型

范型作为本次更新最受瞩目也是影响最大的地方,我们有必要着重关注一下这里。

- 通过Demo认识范型

这是一个官方Demo,在无范型支持的go项目里,实现Sum实现如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/ SumInts adds together the values of m.
func SumInts(m map[string]int64) int64 {
var s int64
for _, v := range m {
s += v
}
return s
}

// SumFloats adds together the values of m.
func SumFloats(m map[string]float64) float64 {
var s float64
for _, v := range m {
s += v
}
有了范型,上面的代码可以写成这样
Add a generic function to handle multiple types
1
2
3
4
5
6
7
8
9
// SumIntsOrFloats sums the values of map m. It supports both int64 and float64
// as types for map values.
func SumIntsOrFloats[K comparable, V int64 | float64](m map[K]V) V {
var s V
for _, v := range m {
s += v
}
return s
}
Go1.18 不仅仅支持范型函数,还可以使用 **定义类型约束** 方式
declare a type constraint
1
2
3
type Number interface {
int64 | float64
}
上面的代码就定一个叫Number的类型接口,Sum函数可以对应做如下修改。
declare function
1
2
3
4
5
6
7
8
9
// SumNumbers sums the values of map m. It supports both integers
// and floats as map values.
func SumNumbers[K comparable, V Number](m map[K]V) V {
var s V
for _, v := range m {
s += v
}
return s
}

以上就是 关于范型的简单使用,如果你在编程中没有想到使用范型,真心建议别勉强使用,毕竟没有范型只是多C/V几次。

更多关于Go1.18的更新参见: https://go.dev/doc/go1.18


参考

评论