Go 1.13简介

Go的最新发行版(版本1.13)比Go 1.12晚了六个月。它的大部分更改是在工具链,运行时和库的实现中进行的。与往常一样,该发行版保留了Go 1 兼容性的承诺。我们希望几乎所有Go程序都能像以前一样继续编译和运行。
从Go 1.13开始,默认情况下,go命令使用Google运行的Go模块镜像和Go校验和数据库下载并验证模块。 有关这些服务的隐私信息,请参阅https://proxy.golang.org/privacy;有关 配置详细信息(包括如何禁用这些服务器或使用其他服务器)的信息, 请参阅 go命令文档。如果您依赖于非公共模块,请参阅用于配置环境文档

语言变更

Go 1.13支持一组更为统一和现代化的数字文字前缀。

  • 二进制整数文字:前缀0b0B表示二进制整数文字,例如0b1011
  • 八进制整数文字:前缀0o0O表示八进制整数文字,例如0o660。现有的八进制一家领先的表示0,随后八进制数字仍然有效。
  • 十六进制浮点文字:前缀0x0X现在可用于以十六进制格式表示浮点数的尾数,例如0x1.0p-1021。十六进制浮点数必须始终有一个指数,以字母表示 pP以十进制表示。指数将尾数按2缩放至指数的幂。
  • 虚数文字:虚数后缀i现在可以与任何(二进制,十进制,十六进制)整数或浮点文字一起使用。
  • 位分离器:任何数量的文字的数字现在可以分离(分组)使用下划线,诸如在1_000_0000b_1010_01103.1415_9265。下划线可能出现在任意两个数字之间,或者字面量前缀和第一个数字之间。

工具类

环境变量

在Go 1.13中,module mode优先级提升,GO111MODULE的默认值依然为auto,但在这个auto下,无论是在GOPATH/src下还是GOPATH之外的repo中,只要目录下有go.mod,go编译器都会使用go module来管理依赖

GOPROXY支持设置为多个proxy的列表(多个proxy之间采用逗号分隔),Go编译器会按顺序尝试列表中的proxy以获取依赖包数据,但是当有proxy server服务不可达或者是返回的http状态码不是404也不是410时,go会终止数据获取。

  1. GOPROXY=https://goproxy.cn,自己在国外主机使用athens搭建的代理,direct

go generate

传送:https://www.yuque.com/jiangwei-3zuwt/rieow9/fp2lbz

Runtime

数组和切片

下标越界错误提示变的友好

  • s[3]在长度为1的切片上,将出现“运行时错误:索引超出长度[1]的范围[3]”

defer

defer语法让Gopher在进行资源(文件、锁)释放的过程变动优雅很多,也不易出错。但在性能敏感的应用中,defer带来的性能负担也是Gopher必须要权衡的问题。在Go 1.13中,Go核心团队对defer性能做了大幅优化,官方给出了在大多数情况下,defer性能提升30%的说法。

  1. package defer_test
  2. import "testing"
  3. func sum(max int) int {
  4. total := 0
  5. for i := 0; i < max; i++ {
  6. total += i
  7. }
  8. return total
  9. }
  10. func foo() {
  11. defer func() {
  12. sum(10)
  13. }()
  14. sum(100)
  15. }
  16. func BenchmarkDefer(b *testing.B) {
  17. for i := 0; i < b.N; i++ {
  18. foo()
  19. }
  20. }

image.png

sync

sync包中Mutex、RWMutex的方法的inline化带来的性能提升,官方说法是10%。我们同样来benchmark一下:

  1. package mutex_test
  2. import (
  3. "sync"
  4. "testing"
  5. )
  6. func sum(max int) int {
  7. total := 0
  8. for i := 0; i < max; i++ {
  9. total += i
  10. }
  11. return total
  12. }
  13. func foo() {
  14. var mu sync.Mutex
  15. mu.Lock()
  16. sum(10)
  17. mu.Unlock()
  18. }
  19. func BenchmarkMutex(b *testing.B) {
  20. for i := 0; i < b.N; i++ {
  21. foo()
  22. }

image.png

GC

1.13前,进行了垃圾回收之后,内存并不是立刻返回给操作系统,会将内存保留五分钟或更长时间,现在,它将在堆收缩之后立即开始将其返回。但是,在包括Linux在内的许多操作系统上,该操作系统本身都会延迟回收内存,因此直到系统承受内存压力之前,进程RSS才会减少。

核心库

database/sql :新增 NullTime 表示time.Time为null; 新增NullInt32表示int32类型null
reflect:新增Value.IsZero 方法报告Value是否为其类型的零值
net/http

  1. 新字段Transport.WriteBufferSize Transport.ReadBufferSize 允许指定传输读/写缓冲区的大小。
  2. 如果任意字段为0,则使用默认大小4KB
  3. 新字段 Transport.ForceAttemptHTTP2 当提供了非零DialDialTLSDialContext函数
  4. TLSClientConfig,它控制是否启用HTTP/2
  5. Transport.MaxConnsPerHost HTTP/2可以正常使用
  6. TimeoutHandler's ResponseWriter 现在实现Pusher和Flusher接口
  7. 新增103状态码,表示Early Hints
  8. Transport 现在使用 Request.Body's io.ReaderFrom 实现(如果可用) 来优化写入正文

更多参考原文:https://golang.org/doc/go1.13