golang1.16新特性速览
今天是假期最后一天,明天起大家也要陆续复工了。golang1.16也在今天正式发布了。
原定计划是2月1号年前发布的,不过迟到也是golang的老传统了,正好也趁着最后的假期快速预览一下golang1.16的新特性吧。
本文索引
语言內建的资源嵌入支持
之前市面上已经有很多把今天文件嵌入golang二进制程序的工具了,这次golang官方将这一功能加入了embed标准库,从语言层面上提供了支持。
我之前以及写了embed的使用教程,可以看这里。
这儿还有一篇官方推荐的教程。
支持arm64
m1芯片可谓是最近的焦点,golang自然也不会落下。
在golang1.16中官方已经支持darwin/arm64平台,cgo和编译成c语言可调用的动态/静态链接库的功能也已支持。同样受益的还有bsd家族的arm64版本。
现在可以在新版mac上尝试golang了。
不过plugin模式的支持仍在进行中,想要完整支持arm64还需要一段时间。
go modules的新特性
本次更新依旧带来了许多modules的新特性。
GO111MODULE现在默认为on
1.16开始默认启用modules,这在1.15的时候已经预告过了。现在GO111MODULE的默认值为on。
不过golang还是提供了一个版本的适应期,如果你还不习惯modules,可以把GO111MODULE设置回auto。在1.17中这个环境变量将会被删除。
都1202年了,也该学学go modules怎么用了。
go build不再更改mod相关文件
以前的教程里我提到过go build会自动下载依赖,这会更新mod文件。
现在这一行为被禁止了。想要安装、更新依赖只能使用go get命令,go build和go test将不会再做这类工作。
go install的变化
go install在1.16中也有了不小的变化。
首先是通过go install my.module/tool@1.0.0 这样在module末尾加上版本号,可以在不影响当前mod的依赖的情况下安装golang程序。
go install是未来唯一可以安装golang程序的命令,go get的编译安装功能现在可以靠-d选项关闭,而未来编译安装功能会从go get移除。
也就是说go的命令各司其职,不再长臂管辖了。
新的GOVCS环境变量
新的GOVCS环境变量指定了golang用什么版本控制工具下载源代码。
其格式为:GOVCS=<module prefix>:<tool name>,[<module prefix>:<tool name>, ...]
其中module prefix为github.com等,而tool name就是版本控制工具的名字,比如git,svn。
一个更具体的例子是:GOVCS=github.com:git,evil.com:off,*:git|hg
module prefix也可以用*通配任何模块的前缀。
tool name还可以设置为all和off,all代表允许使用任何可用的工具,而off则表示不允许使用任何版本控制工具。
不过现在设置为off的模块的代码仍然可能会被下载。
更多的细节可以参考go help vcs。
相对路径导入不在被允许
golang1.16开始禁止import导入的模块以.开头,模块路径中也不允许出现任何非ASCII字符,所以下面的代码不再合法:
import (
"./tools/factory"
"../models/user"
"some.pkg.com/杀马特/音乐工厂"
)
对非ASCII字符一如既往的不友好,不过也只能按规矩办事了。
标准库的变化
golang1.16除了对标准库进行通常的功能更新和修复,还引入了一些重大变化。
testing
testing包主要的变化是在测试用例里调用os.Exit(0)会从程序终止变成测试失败。
比如这个:
package main
import (
"os"
"testing"
)
func TestXXX(t *testing.T) {
t.Log("exit")
os.Exit(0)
}
现在会是这样的输出:
$ go test -v a_test.go
=== RUN TestXXX
a_test.go:9: exit
--- FAIL: TestXXX (0.00s)
panic: unexpected call to os.Exit(0) during test [recovered]
panic: unexpected call to os.Exit(0) during test
goroutine 18 [running]:
testing.tRunner.func1.2(0x51b920, 0x56cc28)
/usr/local/go/src/testing/testing.go:1144 +0x332
testing.tRunner.func1(0xc000082600)
/usr/local/go/src/testing/testing.go:1147 +0x4b6
panic(0x51b920, 0x56cc28)
/usr/local/go/src/runtime/panic.go:965 +0x1b9
os.Exit(0x0)
/usr/local/go/src/os/proc.go:68 +0x6d
command-line-arguments.TestXXX(0xc000082600)
/tmp/a_test.go:10 +0x76
testing.tRunner(0xc000082600, 0x54df18)
/usr/local/go/src/testing/testing.go:1194 +0xef
created by testing.(*T).Run
/usr/local/go/src/testing/testing.go:1239 +0x2b3
FAIL command-line-arguments 0.004s
FAIL
ioutils包已经废弃
1.16已经标记io/ioutil为废弃,函数被转移到了os和io这两个包里,具体见下表:
| ioutil旧函数 | 新函数 |
|---|---|
| Discard | io.Discard |
| NopCloser | io.NopCloser |
| ReadAll | io.ReadAll |
| ReadDir | os.ReadDir |
| ReadFile | os.ReadFile |
| WriteFile | os.WriteFile |
| TempDir | os.MkdirTemp |
| TempFile | os.CreateTemp |
现在开始可以做移植了。
tcp半连接队列扩容
在Linux kernel 4.1以前,golang设置tcp的listen队列的长度是从/proc/sys/net/core/somaxconn获取的,通常为4096。
而在4.1以后golang会直接设置半连接队列的长度为2^32 - 1也就是4294967295。
更大的半连接队列意味着可以同时处理更多的新加入请求,而且不用再读取配置文件性能也会略微提升。
重大更新io/fs
1.16除了支持嵌入静态资源外,最大的变化就是引入了io/fs包。
golang认为文件的io操作是依赖于文件系统(filesystem,fs)的,所以决定模仿Linux的vfs做一套基于fs的io接口。
这样做的目的有三个:
- os包应该专注于和系统交互而不是包含一部分io接口
- io包和os包分别包含了io接口的一部分,导致互相依赖职责不清晰
- 可以把有关联的一部分文件或者数据组成虚拟文件系统,供通用接口处理提升程序的可扩展性,比如zip打包的文件
所以io/fs诞生了。
fs包中主要包含了下面几种数据类型(都是接口类型):
| 名称 | 作用 |
|---|---|
| FS | 文件系统的抽象,有一个Open方法用来从FS打开获取文件数据 |
| DirEntry | 描述目录项目(包含目录自身)的数据结构 |
| File | 描述文件数据的结构,包含Stat,Read,Close方法 |
| ReadDirFile | 在File的基础上支持ReadDir,可以代表目录自身 |
| FileMode | 描述文件类型,比如是通常文件还是套接字或者是管道 |
| FileInfo | 文件的元数据,例如创建时间等 |
其中有一些接口和os包中的同名,实际上是os包引入fs包后起的别名。
对于FS,还有以下的扩展,以便增量描述文件系统允许的操作:
| 名称 | 作用 |
|---|---|
| GlobFS | 增加Glob方法,可以用通配符查找文件 |
| ReadDirFS | 增加ReadDir方法,可以遍历目录 |
| ReadFileFS | 增加ReadFile方法,可以用文件名读取文件所有内容 |
| StatFS | 增加Stat方法,可以获得文件/目录的元信息 |
| SubFS | 增加Sub方法,Sub方法接受一个文件/目录的名字,从这个名字作为根目录返回一个新的文件系统对象 |
fs包还提供了诸如Glob,WalkDir等传统的文件操作接口。
fs的主要威力在于处理zip、tar文件,以及http的文件接口时可以大幅简化代码。而且新的embed静态资源嵌入也是依赖fs实现的。
因为只是速览的缘故,无法详尽介绍io/fs包,你可以参考golang的文档或这篇文章做进一步了解。
其他改进
其他的改进包括Unicode更新到了13.0、新增加了runtime/metrics包已提供更好更规范的运行时信息等。
同时1.16优化了链接器,现在它在linux/amd64上比1.15快了20-25%,内存占用减少了5-15%。
在Windows上已经全面支持了地址空间布局随机化(ASLR),此前不支持将golang编译为dll时启用ASLR。
本次更新中语言本身没有什么变化。
更多信息可以查看golang1.16 release notes
golang1.16新特性速览的更多相关文章
- Python 3.9 新特性速览
国庆假期,Python 社区发布了 3.9 版本的第一个 stable release. 相比于 3.8,Python 3.9 新特性众多,但不少特性与大多数 Python"使用者" ...
- C# 9.0 新特性预览 - 类型推导的 new
C# 9.0 新特性预览 - 类型推导的 new 前言 随着 .NET 5 发布日期的日益临近,其对应的 C# 新版本已确定为 C# 9.0,其中新增加的特性(或语法糖)也已基本锁定,本系列文章将向大 ...
- C# 9.0 新特性预览 - 空参数校验
C# 9.0 新特性预览 - 空参数校验 前言 随着 .NET 5 发布日期的日益临近,其对应的 C# 新版本已确定为 C# 9.0,其中新增加的特性(或语法糖)也已基本锁定,本系列文章将向大家展示它 ...
- C# 9.0 新特性预览 - 顶级语句
C# 9.0 新特性预览 - 顶级语句 前言 随着 .NET 5 发布日期的日益临近,其对应的 C# 新版本已确定为 C# 9.0,其中新增加的特性(或语法糖)也已基本锁定,本系列文章将向大家展示它们 ...
- C# 9.0 新特性预览 - init-only 属性
C# 9.0 新特性预览 - init-only 属性 前言 随着 .NET 5 发布日期的日益临近,其对应的 C# 新版本已确定为 C# 9.0,其中新增加的特性(或语法糖)也已基本锁定,本系列文章 ...
- Java 16 新特性:record类
以前我们定义类都是用class关键词,但从Java 16开始,我们将多一个关键词record,它也可以用来定义类.record关键词的引入,主要是为了提供一种更为简洁.紧凑的final类的定义方式. ...
- ActiveReports 11 新特性速递
又到了一年一度,翘首期盼的ActiveReports11 即将发布,ActiveReports 10 表控件横空出世,成为中国式复杂报表的救星后,ActiveReports11 又会有哪些令人惊奇的新 ...
- Windows Phone 8.1SDK新特性预览
前言 Windows Phone 8.1的预览版将在近期推送,WP 8.1的SDK也已经进入到RC阶段,可以从这里安装.本次更新的SDK被直接集成到了VS2013Update2里面,不再是单独的 ...
- avalon1.3的新特性预览
avalon1.2的性能优化风暴很快就告一段落,入职也快一个月了,许多乱七八糟的事也少了下来,估计未来一个月会有许多好东呈现给大家. 首先是一个性能检测工具.由于MVVM是将原本由人脑干的事,转到各种 ...
随机推荐
- 数据库性能调优之始: analyze统计信息
摘要:本文简单介绍一下什么是统计信息.统计信息记录了什么.为什么要收集统计信息.怎么收集统计信息以及什么时候收集统计信息. 1 WHY:为什么需要统计信息 1.1 query执行流程 下图描述了Gau ...
- .net core 和 WPF 开发升讯威在线客服与营销系统:使用 TCP协议 实现稳定的客服端
本系列文章详细介绍使用 .net core 和 WPF 开发 升讯威在线客服与营销系统 的过程.本产品已经成熟稳定并投入商用. 在线演示环境:https://kf.shengxunwei.com 注意 ...
- mysql主从复制安装配置
mysql主从复制安装配置 基础设置准备 #操作系统: centos6.5 #mysql版本: 5.7 #两台虚拟机: node1:192.168.182.111(主) node2:192.168.1 ...
- Beating JSON performance with Protobuf https://auth0.com/blog/beating-json-performance-with-protobuf/
Beating JSON performance with Protobuf https://auth0.com/blog/beating-json-performance-with-protobuf ...
- aio 系列函数是由 POSIX 定义的异步操作接口,可惜的是,Linux 下的 aio 操作,不是真正的操作系统级别支持的,它只是由 GNU libc 库函数在用户空间借由 pthread 方式实现的,而且仅仅针对磁盘类 I/O,套接字 I/O 不支持。
30 | 真正的大杀器:异步I/O探索 https://time.geekbang.org/column/article/150780
- CSS补充2
浮动是css里面布局最多的一个属性效果:两个元素并排了,并且两个元素都能够设置宽度和高度 四个特性: 1.浮动的元素脱标 2.浮动的元素互相贴靠 3.浮动的元素有"字围"效果 4. ...
- Flash 终将谢幕:微软将于年底( 2020 年 )停止对 Flash 的支持
近日,微软宣布将于今年 12 月终止对 Adobe Flash Player 的支持,届时,微软旗下所有浏览器都将无法使用 Flash,Adobe 也不会在今年 12 月后发布安全更新.早在 2017 ...
- linux切割日志
1.vim log.sh,将文件复制进去#!/bin/sh LOG_PATH=/home/tomcat/apache-tomcat-7.0.56/logs/ LOG_NAME=catalina.out ...
- UML实战总结——机房收费系统UML第一版部分图展
距离机房收费系统已经过去了近2个月之久,如今的UML图才出来,从软件开发设计的逻辑上来讲这是顺序有问题的,不过,对于我们而言,而且是初次用面向对象的思想去设计和建模,就当是UML的一个实战练手的项目吧 ...
- Linux下统计CPU核心数量
首先第一步,cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 45 model name ...