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就不太方便了。
- 其他重要的变更项目
- go mod vender 支持修改路径
- httpclient禁用 tls1.0 tls1.1
- 默认x509不信任SHA-1签名的证书
二、再说说范型
范型作为本次更新最受瞩目也是影响最大的地方,我们有必要着重关注一下这里。
- 通过Demo认识范型
这是一个官方Demo,在无范型支持的go项目里,实现Sum实现如下
1 | / SumInts adds together the values of m. |
有了范型,上面的代码可以写成这样
1 | // SumIntsOrFloats sums the values of map m. It supports both int64 and float64 |
Go1.18 不仅仅支持范型函数,还可以使用 **定义类型约束** 方式
1 | type Number interface { |
上面的代码就定一个叫Number的类型接口,Sum函数可以对应做如下修改。
1 | // SumNumbers sums the values of map m. It supports both integers |
以上就是 关于范型的简单使用,如果你在编程中没有想到使用范型,真心建议别勉强使用,毕竟没有范型只是多C/V几次。
更多关于Go1.18的更新参见: https://go.dev/doc/go1.18
参考