go版本发布历史

go版本发布历史 -- 概要--

1.13 版本

从Go 1.13开始,go命令默认使用Go module mirror和Go checksum database来下载和认证modules。

语言的变化

根据数字文字提案,Go1.13支持更统一和现代化的数字文字前缀

前缀0b或0B表示二进制整数字面值,例如:0b1011

前缀0o或0O表示八进制整数字面值,例如:0o660

前缀0x或0X可以用来表示十六进制浮点数的尾数,例如:0x1.0p-1021

Imaginary literals 虚数后缀i可以与任何(二进制、十进制、十六进制)整数或浮点字面值一起使用

Digit separators 可以使用下划线分隔(分组)任何数字,例如:1_000_000、0b_1010_0110、3.1415_9265,下划线可能出现在任何两位数字或字符前缀和第一位数字之间

Go 1.13之前为满足左移位(<<)和右移位(>>)运算符的操作数必须是无符号数的限制,需要进行大量手动uint类型转换。根据有符号移位计数提议,Go 1.13移除了移位操作数必须是无符号数的限制,消除手动类型转换的需要

工具链

Modules

环境变量

GO111MODULE 依然以auto为默认值,但是只要当前目录包含或者其子目录包含go.mod文件--即使当       前目录在GOPATH/src中,都会激活go命令的module-aware模式。这项更改简化来GOPATH/src中现有   代码的迁移并且继续维护module-aware和non-module-aware模式

GOPRIVATE 这个新的环境变量指示非公开的module路径,它用在较低级别的GONOPROXY和                       GONOSUMDB变量的默认值,通过代理提取哪些模块并使用校验和数据库进行验证,从而提供更细粒度  的控制

GOPROXY environment variable 可以设置为以逗号分隔的代理URL列表或特殊token direct,默认值https://proxy.golang.org,direct。当解析包含其模块的包路径时,go命令将在列表中的每一个代理上陆续尝试所有候选模块路径。代理不可达或HTTP状态码不是400或410,将终止搜索而无需咨询其余代理

GOSUMDB 标识数据库名称以及可选的公钥和服务器URL,以查询主模块的go.sum文件中尚未列出的模块和校验和。如果GOSUMDB不包括显示的URL,通过探测GOPROXY URLs选择支持校验和数据库的endpoint作为URL,如果任何代理都不支持则返回到指定数据库的直接连接。如果GOSUMDB设置为off,则不会查询校验和数据库只验证go.sum文件中的现有校验和

无法访问默认代理和校验和数据库的用户(防火墙)可能会通过将GOPROXY设置为直接和/或将GOSUMDB设置为关闭来禁用

go env -w 可以设置用户的环境变量,与平台无关。默认的设置存储在go/env os.UserConfigDir()文件内

go env -w GOPROXY=direct

go env -w GOSUMDB=off

go env -u  # (unset)取消设置

go get

在module-aware模式下,go get搭配-u参数现在只更新一个更小的模块集合,这与GOPATH模式下使用go get -u命令更新软件包集更加一致

go get -u <package name>继续更新命令行上命名的模块和包,但额外只更新命名包导入的包的模块; go get 子命令现在支持版本后缀@patch,@patch后缀表示指定的模块或包含命名包的模块应更新为具有与构建列表中找到的版本相同的主要和次要版本的最高修补程序版本

特别注意,go get -u(不带参数)现在只更新当前目录中包的传递导入。要更新主模块传递的所有包(包括测试依赖项),请使用go get -u all。不再支持go get -m(go在加载包之前停止)子命令; go get -d(下载构建命名包的依赖关系所需的源代码之后停止)子命令仍然受支持

Version validation

从版本控制系统中提取模块时,go命令现在对请求的版本字符串执行附加验证--go命令验证伪版本和版本控制元素之间的映射

版本前缀必须vX.0.0的形式,或者从修订版本的祖先上的标记派生,或者从包含指定修订本身的构建元数据标记派生

如果主模块中的require指令使用无效的伪版本,通常可以通过将版本编辑为提交hash并重新运行go命令来纠正,例如:go list -m all 或 go mod tidy

example

require github.com/docker/docker v1.14.0-0.20190319215453-e7b5f7dbe98c

(redacted to) => require github.com/docker/docker e7b5f7dbe98c

(currently resolves to) =>require github.com/docker/docker v0.7.3-0.20190319215453-e7b5f7dbe98c

Compiler Toolchain
编译器有一个新的更精确的逃逸分析实现。对大多数代码应该是一个改进(更多的Go变量和表达式分配在栈而不是堆);但是这种提高的精度也可能会破坏之前运行的代码使之变得无效(例如,违反unsafe.Pointer安全规则的代码)

Assembler
汇编器现在支持许多ARM v8.1中引入的许多原子指令

运行时

Out of range panic 消息现在包含出界的索引和切片的容量/长度,例如:切片s[3]长度为1,Panic消息表示runtime error: index out of range [3] with length 1

此版本将大多数使用defer的性能提高了30%

运行时更积极地将内存还给操作系统,以使其可供共同租户应用程序使用

核心库

TLS 1.3

Go 1.13的crypto/tls包默认支持TLS(可以将tls13=0添加到GODEBUG环境变量来禁用)

crypto/ed25519 实现Ed25519签名

Error wrapping

错误e可以通过提供返回w的Unwrap方法来包装另一个错误w。e和w都可用于程序,允许e为w提供额外的上下文或重新解释它,同时仍然允许程序基于w做出决策。更多细节清阅读errors package documentation或Error Value FAQ

更新的库

库的微小更改和更新,会考虑与Go 1的兼容性

bytes 新的ToValidUTF8函数返回给定字节切片的副本,每次运行的无效UTF-8字节序列由给定切片替换
context 通过WithValue返回的上下文格式不再依赖于fmt,也会以相同的方式进行字符换化。依赖于之前确切的字符串化的代码可能会受到影响
crypto/tls 现在已弃用对SSL 3.0版(SSLv3)的支持,将在go 1.14中删除,默认情况下禁用。TLS 1.2和1.3现在支持Ed25519证书
crypto/x509 根据RFC 8410以及ParsePKCS8PrivateKey, MarshalPKCS8PrivateKey, and ParsePKIXPublicKey函数,证书和证书请求现在支持Ed25519密钥。搜索系统根目录的路径现在包括 /etc/ssl/cert.pem
database/sql 新增 NullTime 表示time.Time为null; 新增NullInt32表示int32类型null
debug/dwarf 如果在graph类型中遇到未知DWARF标记Data.Type方法不再panic,相反,它表示具有UnsupportedType类型的对象
errors 新增三个函数

**As** 函数查找给定错误链(包装错误序列)中与给定目标类型匹配的第一个错误,如果找到则将目标设置为error value

**Is** 该函数报告给定的错误值是否与另一个链中的错误匹配

**Unwrap** 返回在给定错误(如果存在)上调用Unwrap的结果

fmt

%O以基数8格式化整数,省略0o前缀

scanner现在可接收十六进制浮点数值、下划线分隔数字、ob和0o前缀

Errorf函数有一个新的动词%w,其操作数必须是一个错误。从Errorf返回的错误将有一个Unwrap方法,它返回%w的操作数

go/scanner scanner 已经被更新到能识别新的Go数字文字,特别是具有0b/0B前缀的二进制文字、具有0o/0O前缀的八进制文字和具有十六进制尾数的浮点数,虚数后缀i可以与任何数字文字一起使用、下划线可以用作数字分隔符进行分组

go/types type-checker已经被更新为遵循整数移位新规则

html/template 使用<script>标记并将"module"设置为type属性时,代码将被解释为JavaScript模式脚本

log 新的Writer函数返回标准logger的输出目标

 

math/big

对于Float.Parse和Int.SetString如果基数是0,为方便阅读可以在数字之间使用下划线

Rat.SetString接受非十进制浮点表示

math/bits Add、Sub、Mul、RotateLeft和ReverseBytes 执行时间保证独立于输入

net 在Unix系统上use-vc被设置在resolv.conf,TCP用于DNS解析
新的字段ListenConfig.KeepAlive指定侦听器接受的网络连接保持活动的时段。默认值为0,启用TCP keep-alive,设置为负值可以禁用此功能
net/http

新字段Transport.WriteBufferSize 和 Transport.ReadBufferSize 允许指定传输读/写缓冲区的大小。如果任意字段为0,则使用默认大小4KB

新字段 Transport.ForceAttemptHTTP2 当提供了非零Dial、DialTLS或DialContext函数或TLSClientConfig,它控制是否启用HTTP/2

Transport.MaxConnsPerHost 在HTTP/2可以正常使用

TimeoutHandler's ResponseWriter 现在实现Pusher和Flusher接口

新增103状态码,表示Early Hints

Transport 现在使用 Request.Body's io.ReaderFrom 实现(如果可用) 来优化写入正文

osos/execreflectruntimestrconvstringssyncsyscallsyscall/jstestingtext/scannertext/templatetimeunicode
这些包也有些许更新,这里不一一列出

 

1.12  版本

新版本的更新亮点有: TLS 1.3 的初步支持、模块支持的更强大以及提升 macOS & iOS 的前向兼容性。新版在语言规范方面没做改动。

工具

   go tool vet 不再支持;

   二进制包在下个版本将不再支持;

   go tool tour 不再包含在主二进制发行版中,需要手动安装;

   Go 1.12 在 trace 工具加入了Mutator Utilization 图的支持,它可以方便发现 GC 性能受限的情况;

   Go Module 进一步支持。计划在 Go 1.13 默认启用 module 模式。

Runtime

  • 提升了大量堆(Heap)活跃状态情况下的清理性能,这减少了垃圾回收之后的分配延迟,可以更好地将内存释放回操作系统;
  • Runtime 的 timer 和 deadline 代码随着 CPU 数目的增加,会有更好的表现。这提升了网络连接最后期限(deadline)相关操作的性能;
  • 对大型堆分配的相关修复,提升了内存配置文件的精确性;

平台相关

其中关于 FreeBSD 和 macOS,Go 1.12 是最后一个支持 FreeBSD 10.x 和 macOS 10.10 Yosemite 的版本。下个版本的 Go 1.13 将要求 FreeBSD 11.2+ 或 FreeBSD 12.0+,对于 macOS,则要求 macOS 10.11 El Capitan 或更新版本。

核心库

  • TLS 1.3

Go 1.12 在 RFC 8446 指定的crypto/tls包中添加了对 TLS 1.3 的选择支持。可以通过将值 tls13 = 1 添加到 GODEBUG 环境变量来启用它。 它将在 Go 1.13 中默认启用。

相比 godep 和 vendor 机制而言,go modules 已经很先进,Go 1.12 已经发布,可以考虑逐步迁移到go modules。

 

1.11 版本

  • 实验性支持 WebAssembly (js/wasm)。
  • 实验性启用版本和依赖管理 Modules,替代 GOPATH。
  • 最后一个支持 GOCACHE=off 的版本。
  • 编译器支持内联更多类型函数,包括调用 panic 的函数。
  • 编译优化 map delete、slice append。
  • 更准确的调试信息,对没有 -N -l 编译结果提供更好支持。
  • 允许在 delve 调试器中调用函数。
  • 最后一个支持 godoc 命令行的版本,未来基于 web。
  • 内存分配器使用稀疏堆,不再有 512GB 限制。

符号 @ 在 module 中有特殊含义,命令行不再支持 @ 符号。

1.10 版本

工具链从可执行文件路径推导 GOROOT。

可用 GOTMPDIR 设置专用临时目录。

使用 GOCACHE 缓存编译结果,与 GOROOT/GOPATH 中已安装的编译结果隔离。

编译参数(gcflags 等)仅作用于命令行列出的包。

安装命令(go install)仅安装命令行列出的包,不含依赖项。

单元测试(go test)也将使用缓存加速。

性能测试(go tool pprof)新增 WEB 界面。

堆栈跟踪(stack trace)不再包含编译器自动生成(autogenerated)的函数。

GOMAXPROCS 最大限制取消。

LockOSThread/UnlockOSThread 嵌套数量必须匹配。

1.9 版本

类型别名。

并行编译。(GO19CONCURRENTCOMPILATION=0 禁用)

工具集默认不再扫描 vendor 目录。

安装目录不再固定。(可显式设置 GOROOT)

新增 sync/map。

新增 test helper。

新增 pprof label。

1.8 版本

不同的 tag 不再阻止 struct 显式转换。

改善 map 并发操作检测。

垃圾回收暂停时间进一步缩短到(10~100 us)。

函数参数生命周期不再等同整个栈帧,可被提前回收,需用 KeepAlive 保持。

改进 defer、CGO 调用开销(一半)。

编译后端 SSA 支持所有平台,gcflags -ssa=0 参数被移除。

支持默认 GOPATH 设置 $HOME/go。

支持插件模式(buildmode: plugin)。

支持 mutex profile。

工具链 yacc 移除。

工具链 pprof 支持 https+insecure 模式。

HTTP2/push,HTTP Server Graceful Shutdown。

 

1.7  版本

  • AMD64 使用 SSA 后端,可使用 gcflags "-ssa=0" 关闭。
  • 新二进制格式。
  • 链接器不再支持 -X name value,须使用 -X name=value。
  • 包依赖 vendor 成为正式功能,移除 GO15VENDOREXPERIMENT 环境变量。
  • 为 x86–64 增加对 Linux’s perf、Intel’s VTune 工具支持(设置并保存 BP 寄存器值)。
  • 实验性支持 Binary-only package。(静态包,不再需要源码文件)

BP 寄存器可选: 在 make.bash 构建工具链时添加GOEXPERIMENT=noframepointer 屏蔽。

1.6 版本

CGO 支持指针共享。

重写 parser,替代 yacc 生成。

编译器增加 -msan 参数,支持 Clang MemorySanitizer,用于探测读未初始化内存(CGO)。

增加 buildmode c-shared 支持。

GO15VENDOREXPERIMENT 默认 1。

HTTP2 支持。

1.5  版本

用 Go 重写运行时和编译器,需要使用 Go 编译 Go。

对 6g、6l 重命名,改为 compile、linker、asm。

新 GC 算法,实现并发标记和清理,增加控制器和辅助回收等。

GOMAXPROCS 默认 cores 数量。

增加 buildmode 支持,生成共享库。

支持 internal、vendor 包。

支持 go tool trace 命令,跟踪执行过程。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值