Go1.14发布了,快来围观新的特性啦
如期而至,Go1.14发布了,和往常一样,该版本保留了Go 1兼容性的承若,这个版本的大部分更新在工具链 、运行时库的性能提升方面,总的来说,还是在已有的基础上不断优化提成,大家期待的泛型还没有到来,下面一块看看新的变化吧,以下变化我本地测试过。
Go 1.14 test 优化
go test -v现在将t.Log输出流式传输,而不是在所有测试数据结束时输出。
testing包的T、B和TB都加上了CleanUp方法,主要作用可以用来测试结束后清理资源,如下代码,输出结果是 test cleanup, clear resourcce , 那么问题来了,如果我在方法中再加一个defer呢,是Cleanup最后执行还是defer最后执行
func TestCleanup(t *testing.T) {
t.Cleanup(func() {
t.Log("clear resource")
})
t.Log("test cleanup")
}
看下面测试代码,我们在Cleanup之前和之后都加上defer函数,打印结果如下,我们可以看到,Cleanup还是在defer之后,原理暂时不说了,我也没研究。
func TestCleanup(t *testing.T) {
defer func() { t.Log("defer resource1") }()
t.Cleanup(func() {
t.Log("clear resource")
})
defer func() { t.Log("defer resource2") }()
t.Log("test cleanup")
}
test cleanup
defer resource2
defer resource1
clear resource
Go 1.14 defer优化
defer与直接调用延迟函数相比, 此版本提高了大多数使用的性能,从而产生了几乎为零的开销。结果,defer现在可以在对性能至关重要的代码中使用,而无需担心开销,我们看一下压测报告
//声明一个通道
type channel chan string
//正常关闭
func NoDefer() {
ch1 := make(channel, 10)
close(ch1)
}
//采用defer关闭
func Defer() {
ch2 := make(channel, 10)
defer close(ch2)
}
Go1.13 的基准测试报告如下

Go1.14 的基准测试报告如下

关于这一改进,官方给出的回应是:Go1.14提高了defer的大多数用法的性能,几乎0开销!defer已经可以用于对性能要求很高的场景了.
Go1.14 添加了新包maphash
包maphash提供字节序列的哈希函数。这些哈希函数用于实现哈希表或其他数据结构,这些数据结构需要将任意字符串或字节序列映射到无符号64位整数上的统一分布,哈希函数是抗冲突的,但不是加密安全的
func MapHashStudy() {
b := []byte("foo")
h1 := new(maphash.Hash)
h1.Write(b)
//输出字节数组的hash值
fmt.Println(h1.Sum64()) //63175979700884496
}
Go1.14 time.Timer定时器性能得到“巨幅”提升
下图是官方的一个压测数据报告,从基准测试的结果可以看出Go1.14 time包中Ticker等函数性能都得到了“巨幅”提升,数据来源如下,我们可以看到Ticker从 5.4ms 提成到了 0.03ms,非常恐怖的
https://github.com/golang/go/commit/6becb033341602f2df9d7c55cc23e64b925bbee2

Go1.14 goroutine支持异步抢占
Go语言调度器的性能随着版本迭代表现的越来越优异,GMP的概念大家应该都知道,不明白了可以百度一下,这里不说了。
在Go1.1版本中,调度器还不支持抢占式调度,只能依靠 goroutine 主动让出 CPU 资源,存在非常严重的调度问题。
Go1.12中编译器在特定时机插入函数,通过函数调用作为入口触发抢占,实现了协作式的抢占式调度。但是这种需要函数调用主动配合的调度方式存在一些边缘情况,就比如说下面的例子:
func main() {
runtime.GOMAXPROCS(1)
go func() {
for {
}
}()
time.Sleep(time.Millisecond)
println("OK")
}
上面代码中,其中创建一个goroutine并挂起, main goroutine 优先调用了 休眠,此时唯一的 P 会转去执行 for 循环所创建的 goroutine,进而 main goroutine 永远不会再被调度。换一句话说在Go1.14之前,上边的代码永远不会输出OK,因为这种协作式的抢占式调度是不会使一个没有主动放弃执行权、且不参与任何函数调用的goroutine被抢占。
Go1.14 实现了基于信号的真抢占式调度解决了上述问题。Go1.14 程序启动时, 会在函数runtime.sighandler 中注册了 SIGURG 信号的处理函数 runtime.doSigPreempt,在触发垃圾回收的栈扫描时,调用函数挂起goroutine,并向M发送信号,M收到信号后,会让当前goroutine陷入休眠继续执行其他的goroutine
Go1.14 生态建设
https://pkg.go.dev 是 go.org的配套网站,里边有精选用例和其他资源的信息,提供了godoc.org 之类的 Go 文档,但它使用起来更方便,并提供了有关软件包先前版本的信息,它还可以检测并显示许可证,并具有更好的搜索算法。

如上图,是网站的首页,大家可以进去搜索一下,看看有没有新发现。
最后,Go1.14 还有很多改动
- WebAssembly的变化
- reflect包的变化
- go mod的变化
- 很多其他重要的包(math,http等)的改变
很多变化需要大家去探索,本文列出了其中几个我认为大家必须知道的改变,只是入门,更多原理需要大神们不断探索,当然我也会尽可能的阅读源码研究。

Go1.14发布了,快来围观新的特性啦的更多相关文章
- Java 14 发布了,可以扔掉Lombok了?
2020年3月17日发布,Java正式发布了JDK 14 ,目前已经可以开放下载.在JDK 14中,共有16个新特性,本文主要来介绍其中的一个特性:JEP 359: Records 官方吐槽最为致命 ...
- Java 14 发布了,再也不怕 NullPointerException 了!
2020年3月17日发布,Java正式发布了JDK 14 ,目前已经可以开放下载.在JDK 14中,共有16个新特性,本文主要来介绍其中的一个特性:JEP 358: Helpful NullPoint ...
- 转:关于C++14:你需要知道的新特性
关于C++14:你需要知道的新特性 遇见C++ Lambda C++14 lambda 教程 C++11 lambda表达式 C++标准库:使用 std::for_each std::generate ...
- 从Kubernetes 1.14 发布,看技术社区演进方向
Kubernetes 1.14 正式发布已经过去了一段时间,相信你已经从不同渠道看过了各种版本的解读. 不过,相比于代码 Release,马上就要迎来5周岁生日的Kubernetes 项目接下来如何演 ...
- Go1.14版本vendor和gomodule冲突问题
Go1.14版本vendor和gomodule冲突问题 go1.14版本使用go mod tidy构建依赖时会出现问题(见链接), 这个问题在go1.12版本是不会出现的. https://githu ...
- Netty 4.0 新的特性及需要注意的地方
Netty 4.0 新的特性及需要注意的地方 这篇文章和你一起过下Netty的主发行版本的一些显著的改变和新特性,让你在把你的应用程序转换到新版本的时候有个概念. 项目结构改变 Netty的包名从or ...
- Atitit. Object-c语言 的新的特性 attilax总结
Atitit. Object-c语言 的新的特性 attilax总结 1.1. Object-C语言由 Brad J.Cox于20世纪80年代早期设计,1 1.2. Object-C新增的数据结构: ...
- [C#] 回眸 C# 的前世今生 - 见证 C# 6.0 的新语法特性
回眸 C# 的前世今生 - 见证 C# 6.0 的新语法特性 序 目前最新的版本是 C# 7.0,VS 的最新版本为 Visual Studio 2017 RC,两者都尚未进入正式阶段.C# 6.0 ...
- C# 3.0新语言特性和改进(一)
引言 关于C#3.0的特性,园子里已经有了一大把,可能大家都很熟悉了,虽然本人开发中使用过,但自己还是需要记录一下,总结一下.同时也是后面写Linq知识的基础.希望有兴趣的朋友,可以看看. C# 3. ...
随机推荐
- Windows和Linux换行的区别
Linux下的换行符是: "\n" Windows的换行符 : "\r\n" r = return n = newline TODO 原因: 根据平台自己转化的 ...
- 隐隐约约 听 RazorEngine 在 那里 据说 生成代码 很 美。
这只是 一个开始 ....
- HGE引擎改进——2014/1/27
2014/1/27 更新 hge库: 1.增加回调函数procResizeFunc(),这个函数会在窗口大小改变时调用,不是必要函数 2.修复LOG信息显示为乱码的错误 项目主页:https://co ...
- 《即时消息技术剖析与实战》学习笔记9——IM系统如何支持消息的多终端漫游
一.什么是多终端漫游 多终端漫游是指:用户在任意一个设备登录后,都能获取到历史的聊天记录.如:QQ 默认漫游 7 天的聊天记录,开通 VIP 会员可漫游 30 天,开通 SVIP 会员可漫游 2 年. ...
- 004-OSI参考模型和分层思想
OSI参考模型 应用层 所有能产生网络流量的程序 表示层 在传输之前是否进行加密或者压缩处理 涉及安全问题 会话层 Session 是建立在传输层之上,利用传输层提供的服务,使应用建立和维持会话,并能 ...
- Django部署--uwsgi配置--nginx服务器配置
uwsgi.ini文件 [uwsgi] #使用nginx连接时使用,Django程序所在服务器地址 socket=127.0.0.1:8000 #直接做web服务器使用,Django程序所在服务器地址 ...
- jmeter处理http请求Content-Type类型和传参方式
引言 我们在做接口测试的时候经常会忽略数据类型content-type的格式,以及参数Parameters和Body Data的区别和用途. 对于初次接触接口的同学来说,自己在发送一个http请求时, ...
- LUA学习笔记(第18-20章)
数学库 print(math.pi)-->π print(math.huge)-->Lua中表示的最大数字 --[[ 3.1415926535898 1.#INF ]] print(mat ...
- BZOJ 1087 [SCOI2005]互不侵犯King(状压DP)
题意:在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子.n<=9 思路:状压dp,dp[i][ ...
- Go语言实现:【剑指offer】跳台阶
该题目来源于牛客网<剑指offer>专题. 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). 1阶:共1种跳法: 2阶 ...