如期而至,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 还有很多改动

  1. WebAssembly的变化
  2. reflect包的变化
  3. go mod的变化
  4. 很多其他重要的包(math,http等)的改变

很多变化需要大家去探索,本文列出了其中几个我认为大家必须知道的改变,只是入门,更多原理需要大神们不断探索,当然我也会尽可能的阅读源码研究。

![](https://img2018.cnblogs.com/blog/706455/201909/706455-20190911210708072-261554801.jpg)

Go1.14发布了,快来围观新的特性啦的更多相关文章

  1. Java 14 发布了,可以扔掉Lombok了?

    2020年3月17日发布,Java正式发布了JDK 14 ,目前已经可以开放下载.在JDK 14中,共有16个新特性,本文主要来介绍其中的一个特性:JEP 359: Records 官方吐槽最为致命 ...

  2. Java 14 发布了,再也不怕 NullPointerException 了!

    2020年3月17日发布,Java正式发布了JDK 14 ,目前已经可以开放下载.在JDK 14中,共有16个新特性,本文主要来介绍其中的一个特性:JEP 358: Helpful NullPoint ...

  3. 转:关于C++14:你需要知道的新特性

    关于C++14:你需要知道的新特性 遇见C++ Lambda C++14 lambda 教程 C++11 lambda表达式 C++标准库:使用 std::for_each std::generate ...

  4. 从Kubernetes 1.14 发布,看技术社区演进方向

    Kubernetes 1.14 正式发布已经过去了一段时间,相信你已经从不同渠道看过了各种版本的解读. 不过,相比于代码 Release,马上就要迎来5周岁生日的Kubernetes 项目接下来如何演 ...

  5. Go1.14版本vendor和gomodule冲突问题

    Go1.14版本vendor和gomodule冲突问题 go1.14版本使用go mod tidy构建依赖时会出现问题(见链接), 这个问题在go1.12版本是不会出现的. https://githu ...

  6. Netty 4.0 新的特性及需要注意的地方

    Netty 4.0 新的特性及需要注意的地方 这篇文章和你一起过下Netty的主发行版本的一些显著的改变和新特性,让你在把你的应用程序转换到新版本的时候有个概念. 项目结构改变 Netty的包名从or ...

  7. Atitit. Object-c语言 的新的特性  attilax总结

    Atitit. Object-c语言 的新的特性  attilax总结 1.1. Object-C语言由 Brad J.Cox于20世纪80年代早期设计,1 1.2. Object-C新增的数据结构: ...

  8. [C#] 回眸 C# 的前世今生 - 见证 C# 6.0 的新语法特性

    回眸 C# 的前世今生 - 见证 C# 6.0 的新语法特性 序 目前最新的版本是 C# 7.0,VS 的最新版本为 Visual Studio 2017 RC,两者都尚未进入正式阶段.C# 6.0 ...

  9. C# 3.0新语言特性和改进(一)

    引言 关于C#3.0的特性,园子里已经有了一大把,可能大家都很熟悉了,虽然本人开发中使用过,但自己还是需要记录一下,总结一下.同时也是后面写Linq知识的基础.希望有兴趣的朋友,可以看看. C# 3. ...

随机推荐

  1. 关于Error executing aapt的问题

    这两天装了ubuntu 14.0.4系统,在这个系统上装了eclipse的android开发环境.原以为一切顺利,结果开发环境装完导入工程后,工程提示有红叉. R文件不能自动生成,按R文件不能自动生成 ...

  2. RChain的一键形式化验证:关于RCast 33 – LADL话题的讨论摘要

    作者/Atticbee 在这一集,Greg和RChain的研究人员Isaac,Christian讨论了TLA(Temporal Logic of Actions)和RChain的LADL(Logic ...

  3. Python赋值没有返回值+笔试

    >>> def test(): i = 1 return i=2 SyntaxError: invalid syntax 原因是python 中赋值语句没有返回值,这里不是C++

  4. copy and swap技巧与移动赋值操作符

    最近在实现一个Delegate类的时候碰到了一个问题,就是copy and swap技巧和移动赋值操作符有冲突. 比如有以下一个类: class Fun { public: Fun(const Fun ...

  5. MySQL5.6绿色版安装

    1.下载 MySQL绿色版安装需下载好三个文件 (1).MySQL5.6版本离线安装包 (2).Microsoft Visual C++ (3).Microsoft .NET Framework 1. ...

  6. 安卓开发实战-记账本APP(五)

    今天将昨天剩余的bug修复,并且完成图标的美化,设置长按删除,模仿支付宝实现金额的动态增加. ①将昨天的布局进行了修改:之前是fragment,改成FrameLayout布局,不再设置name,进而在 ...

  7. 尝试在阿里云的Linux服务器器上安装拥有图形界面的Pycharm

    在Linux服务器上跑Python项目发现每次从本地上传文件太过麻烦,于是打算在服务器上安装Pycharm直接写Pycharm代码.   去Pycharm的官网下载Linux版本(支持正版于是我下载了 ...

  8. CSS 对于grid布局的理解,举例代码及解释

    网格布局介绍: CSS Grid(网格) 布局(又称为 “Grid(网格)” ),是一个二维的基于网格的布局系统它的目标是完全改变我们基于网格的用户界面的布局方式.CSS 一直用来布局我们的网页,但一 ...

  9. lua学习之类型与值篇

    类型与值 lua 是动态类型的语言 在语言中没有类型定义的语法 每个值都携带有它的类型信息 8种基础类型 用 type 可以返回这个值的类型的名称 将一个变量用于不同类型,通常会导致混乱的代码 但合理 ...

  10. logstash split插件的使用(将一个事件拆分成多个事件)

    kafka中的原始数据格式(1条数据) { "body": { "cwd": "/home/test/", "monitor&qu ...