专栏首页01ZOOGo语言各版本特性回顾(1.5-1.14)
原创

Go语言各版本特性回顾(1.5-1.14)

功能概览

备注1:有一些变化比如 runtime, 调度器,go mod 是在持续优化的,下面的列表中进行了省略 备注2:本文关注实用变化,即 以前这么用,但是现在这么用更好 的特性变化

版本

功能

备注

Go 1.5

垃圾收集器优化

Go 1.5

GOMAXPROCS=可用核心数

意味着大部分情况下无需手动设置GOMAXPROCS,旧版本 GOMAXPROCS=1

Go 1.5

内部包支持

内部引用的库放在 internal 文件夹下,外部无法引用,参考

Go 1.5

go tool trace命令

支持细粒度的程序执行跟踪

Go 1.5

go doc 命令

1.13 被移除,需要单独下载安装

Go 1.6

支持 HTTP/2 协议

只要我们使用TLS则会默认启动HTTP/2特性

Go 1.7

Context 库和 vendor 支持优化

context 成为重要的控制流、上下文传递工具

Go 1.8

垃圾回收器进一步优化

延迟时间全面降到毫秒级别以下

Go 1.9

type alias 支持

当你使用 type T2 T1 的时候需要考虑是不是使用 type T2 = T1 更好

Go 1.9

Test Helper函数

新加`(T).Helper和(B).Helper m`, 用来标记调用的函数是一个测试辅助函数

Go 1.10

go build/test 增加缓存优化

加速构建/测试性能,当你使用 容器进行构建/测试时,如果效率较低,考虑复用缓存

Go 1.11

引入 Go modules

从此 go mod 逐渐成为主流包管理方式

Go 1.12

go vet 工具

go tool vet不再支持

Go 1.13

sync.Pool 优化

垃圾回收时,pool中对象不会被完全清理掉。它引入了一个cache,用于在两次GC之前清理pool中未使用的对象实例

Go 1.13

defer 性能优化

性能提高 30%

Go 1.13

新的逃逸分析(escape analysis)器

分析代码,何时分配到 stack 而不是heap,关于escape analysis 如何影响性能,参考一个例子

Go 1.13

errors包优化

支持 wrapping,fmt.Errorf 增加 %w 格式符,errors 包增加三个函数(Unwrap、Is、As),很实用

Go 1.13

Go modules成为默认值

Go 1.13 后 GOPROXY 和 GOSUMDB 都会有默认值

Go 1.14

defer 性能再次优化

Go1.14提高了defer的大多数用法的性能,几乎0开销。defer已经可以用于对性能要求很高的场景了

Go 1.14

time.Timer 性能提升

针对 timer 性能问题的很多优化不再有必要了

Go 1.14

允许嵌入具有重叠方法集的接口

type ReadWriteCloser interface { io.ReadCloser;io.WriteCloser} 不会报错

Go 1.14

testing包的T、B和TB都加上了CleanUp方法

类似 defer,清理测试申请资源

Go with 1.14

  1. 大部分时候,不必关心垃圾回收的性能问题
  2. 大部分时候,不需要关心 time.Timer, defer 的性能问题
  3. 用 go mod 做包管理
  4. go build/vet/test/too trace 等工具很好用,注意跟踪他们的变化
  5. 内置的 context.Context, error 重要且实用

Go 2.0 展望

目前仍是草案阶段,三个方面

  1. Error handling: 提出了一套 check and handle 的方案,争议还是比较大 (try catch 还是 error handle 风格)
  2. Error values: 已经在 1.1x 后逐渐出现了
  3. Generics: 简单的泛型,contract,仍有争议

go 2.0 目的是解决目前 go 语言开发者中争议最大的两个问题

  1. error 处理
  2. 缺乏泛型

如何优化这两项体验的同时不引入过多复杂度是一个重要的难题(同时要兼容 go 1.x ),毕竟在我看来 go 语言最大的优势就是:“少即时多”。个人觉得:编译器实现复杂度(部分可以体现在编译速度)是考察语言复杂度的重要指标,因为:增加给编译器的复杂度,大部分也在给开发者增加复杂度。一个新语言特性,往往需要另外五个新特性来修补他带来的漏洞。希望 go 2.0 不要带来这类问题。

参考

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 从零开始用golang编写一个分布式测试工具

    当开发http 接口的时候,往往我们会关心开发的server能承受多少压力,这时候一个比较常用的工具是 apache bench。一部分情况下ab工具确实能满足...

    王磊-AI基础
  • 扩展 Kubernetes 之 Kubectl Plugin

    kubectl 功能非常强大, 常见的命令使用方式可以参考 kubectl --help,或者这篇文章

    王磊-AI基础
  • golang技术点整理

    defer的执行次序(先进后出)和执行的点(return之前, 返回值赋值之后)。

    王磊-AI基础
  • nodejs php go语言了解

    1、Nodejs 1) 简单的说 Node.js 就是运行在服务端的 JavaScript。 2) Node.js 是一个基于Chrome JavaScript...

    李海彬
  • Linux操作系统配置Go语言编程环境

    之前一直在windows下写Go,现在工作环境切换至Linux下,因此写下此文,记录安装Go环境的过程。

    Zoctopus
  • Go学习入门

    Go语言的历史要从贝尔实验室开始说起,我们知道贝尔实验室计算科学研究中心的肯•汤普逊 Ken Thompson 和丹尼斯 • 里奇 Dennis Ritchie...

    大江小浪
  • Go学习之新奇视角 - 入门篇(一)

    最近工作中,需要研究Go语言的区块链项目,作为一个Java出身的程序汪,不得不开始走向新的火热学习当中去。

    23号杂货铺
  • Go语言设计和工具链核心团队成员介绍

    大名鼎鼎、如雷贯耳,Unix操作系统的发明人之一(排在第一号),C语言前身B语言的设计者,UTF-8编码设计者之一,图灵奖得主。老爷子今年快76岁了(1943年...

    刘老貘
  • Go语言入门

    最近准备学点新东西,聊聊Go语言入门。 Go是google 09年推出的编程语言,Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲...

    大数据和云计算技术
  • 伙计们,Go 并没有那么简单

    出于好奇,我最近开始接触一些 Go 的代码。我之前对它有一些了解,但是从来没有尝试去写(没有需求)。但是现在我们团队选择使用 Go 来开发一个项目,所以我觉得这...

    李海彬

扫码关注云+社区

领取腾讯云代金券