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支持一组更为统一和现代化的数字文字前缀。
- 二进制整数文字:前缀
0b
或0B
表示二进制整数文字,例如0b1011
。 - 八进制整数文字:前缀
0o
或0O
表示八进制整数文字,例如0o660
。现有的八进制一家领先的表示0
,随后八进制数字仍然有效。 - 十六进制浮点文字:前缀
0x
或0X
现在可用于以十六进制格式表示浮点数的尾数,例如0x1.0p-1021
。十六进制浮点数必须始终有一个指数,以字母表示p
或P
以十进制表示。指数将尾数按2缩放至指数的幂。 - 虚数文字:虚数后缀
i
现在可以与任何(二进制,十进制,十六进制)整数或浮点文字一起使用。 - 位分离器:任何数量的文字的数字现在可以分离(分组)使用下划线,诸如在
1_000_000
,0b_1010_0110
或3.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会终止数据获取。
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%的说法。
package defer_test
import "testing"
func sum(max int) int {
total := 0
for i := 0; i < max; i++ {
total += i
}
return total
}
func foo() {
defer func() {
sum(10)
}()
sum(100)
}
func BenchmarkDefer(b *testing.B) {
for i := 0; i < b.N; i++ {
foo()
}
}
sync
sync包中Mutex、RWMutex的方法的inline化带来的性能提升,官方说法是10%。我们同样来benchmark一下:
package mutex_test
import (
"sync"
"testing"
)
func sum(max int) int {
total := 0
for i := 0; i < max; i++ {
total += i
}
return total
}
func foo() {
var mu sync.Mutex
mu.Lock()
sum(10)
mu.Unlock()
}
func BenchmarkMutex(b *testing.B) {
for i := 0; i < b.N; i++ {
foo()
}
GC
1.13前,进行了垃圾回收之后,内存并不是立刻返回给操作系统,会将内存保留五分钟或更长时间,现在,它将在堆收缩之后立即开始将其返回。但是,在包括Linux在内的许多操作系统上,该操作系统本身都会延迟回收内存,因此直到系统承受内存压力之前,进程RSS才会减少。
核心库
database/sql :新增 NullTime 表示time.Time为null; 新增NullInt32表示int32类型null
reflect:新增Value.IsZero 方法报告Value是否
为其类型的零值
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 实现(如果可用) 来优化写入正文