优秀的编程知识分享平台

网站首页 > 技术文章 正文

软件更新速递:Go发布1.15版本,这些新特性抢先看

nanyue 2024-10-03 23:37:15 技术文章 5 ℃

更多互联网新鲜资讯、工作奇淫技巧关注原创【飞鱼在浪屿】(日更新)


Go 1.14之后的六个月,最新的Go版本1.15版发布了。包括极大改进的连接器和较小的二进制文件。绝对是有史以来最好的Go版本:它的大部分更改是在工具链,运行时和库。与以往一样,保留了Go 1 兼容性的承诺(https://tip.golang.org/doc/go1compat)。几乎所有Go程序都能像以前一样继续编译和运行。

可以从下载页面获取它:https://golang.org/dl/。

一些亮点包括:

  • 对Go连接器的实质性改进
  • 对多个小型对象的分配空间进行优化
  • 放弃支持X.509 CommonName
  • GOPROXY支持跳过返回错误的代理
  • 新的嵌入式tzdata软件包
  • 多项核心库改进

具体更改提示有下面些:


工具类

  • Go命令

GOPROXY环境变量现在支持跳过错误代理。代理URL可以用逗号(,)或竖线字符(|)分隔。如果代理URL后面带有逗号,则该go命令将仅在404或410 的HTTP响应码后,尝试列表中的下一个代理。如果代理URL后面带有竖线字符,该go命令将在出现任何错误后尝试列表中的下一个代理。注意的是,GOPROXY的默认值这样配置https://proxy.golang.org,<direct url>,那么发生错误的情况下不会使用<direct url>。

  • go test

-timeout:测试执行超时多久就会退出

现在更改timeout会使缓存的测试结果无效。超时时间长的测试运行的缓存结果,如果go test改为短时间超时,被重新调用时会视为测试结果无效。

  • flag解析问题

go test和 go vet的flag解析问题已得到修复。GOFLAGS环境变量(作用是给每个go命令加上默认的flag)指定的flag一致性更好,并且-outputdir的目录是go工作目录的相对路径(而不是每个测试的工作目录)。

  • 模块缓存环境变量

现在可以使用GOMODCACHE环境变量设置模块缓存的路径。默认值是GOPATH[0]/pkg/mod。

  • Vet命令(静态代码检查命令)
  • string(x)解析的新告警

Vet检查string(x),其中x不是rune或byte,而是interger类型,vet会发出告警。很多经验表明,string(x)被错误解析为整数表示的字符串。而实际上,它应该评估为一个字符串,包含值的UTF-8编码。例如,string(9786)应该求值"9786";而不是字符串"\xe2\x98\xba"或"?"。

比string(x)好的写法是string(rune(x))。或者,utf8.EncodeRune(buf, x)是正确的解决方案。还有其他写法,strconv.Itoa 或fmt.Sprint。

使用时,默认情况下会启用此新的兽医检查go test。

我们正在考虑在以后的Go版本中禁止这种转化。也就是说,只有x为rune和byte的类型是,才可以进行string(x)转化。但是在这禁止之前,最好使用vet进行静态检查。

  • 无法进行接口转换的新告警

现在,从一种接口类型到另一种接口类型转化失败时,vet会进行告警。一般发生在两种接口类型都实现了具有相同名称但具有不同type的方法。

任何触发此审核检查失败的代码都应重写。执行go test会默认进行go vet检查。

以后的Go版本中会考虑禁止不可能的接口类型声明。但这种语言更改不会向后兼容,所以现在还是需要go vet进行检查。


运行

如果触发panic的type,是由以下衍生:bool,complex64,complex128,float32,float64, int,int8,int16,int32,int64,string, uint,uint8,uint16,uint32,uint64,uintptr,则该值将被打印,而不是仅仅其地址。以前,仅对于这些类型的值才会这样做。

在Unix系统中,如果kill命令或kill系统调用来一个发送SIGSEGV,SIGBUS或SIGFPE信号给Go程序,如果信号没有os/signal.Notify处理,程序现在可以可靠地使用堆栈跟踪崩溃。在早期版本中,行为是无法预测的。

现在在数量多cpu核数,分配小对象内存表现比以往更好,并且最坏情况下的延迟也更低。

将小interger值转换为接口值,不需要做分配。

现在,关闭channel上执行非阻塞receive,和打开channel上执行非阻塞receive表现一样良好。


编译器

包unsafe的安全规则允许在调用某些函数时将转换unsafe.Pointer 为uintptr。以前,编译器需要多次链接转换(例如syscall.Syscall(…, uintptr(uintptr(ptr)), …))。编译器现在只需要一次转换。使用多次转换的代码应进行更新以满足安全规则。

与Go 1.14相比,Go 1.15通过消除某些类型的GC元数据,并且消除了未使用的类型元数据,与Go 1.14相比的二进制包大小减少了大约5%。

根据英特尔Intel CPU erratum SKX102 上GOARCH=amd64,新版本对准函数32个字节的边界和填充跳转指令。尽管此增加了二进制大小,但远远和消除GC元数据对上述二进制大小改进影响不大。

Go 1.15在编译器和汇编器中添加了可选项 -spectre,以允许启用Spectre缓解措施。这个可能永远都不需要配置,主要是作为“纵深防御”机制提供的。有关详细信息,请参见Spectre Wiki页面(https://github.com/golang/go/wiki/Spectre)。

现在,编译器将拒绝//go:对其声明没有意义的编译器指令,认为是“放错位置的编译器指令”错误。此类错误之前编译器选择静默忽略了。

编译器的-json的日志可以支持> = 128字节的文件。


连接器

此版本包括对Go链接器的重大改进,可减少链接器资源的使用(时间和内存)并提高代码的健壮性/可维护性。

对于一组典型的大型Go程序,对于ELF在amd64体系结构上运行的基于OS(Linux,FreeBSD,NetBSD,OpenBSD,Dragonfly和Solaris)的操作系统,链接速度提高20%,平均所需内存减少30%。

链接程序性能得到改进的主要原因是新设计的目标文件格式,以及内部阶段的改进以提高并发性(例如,并行的重定位符号)。Go 1.15中的目标文件比其1.14等价文件稍大。

这些更改是对Go链接器进行现代化改造的多版本项目的阶段结果,也就是说,将来的版本中有望对链接器进行其他改进。

在linux/amd64的链接模式默认设为-buildmode=pieon,C链接器不需要设置这些配置。


Objdump

该objdump的工具现在支持反编译加上-gnu选项。


核心库变化

  • 新的嵌入式tzdata软件包

Go 1.15包括一个新软件包,time/tzdata该软件包 允许将时区数据库嵌入程序中。导入该软件包(import _ "time/tzdata")可以使程序找到时区信息,即使本地系统上不存在时区数据库。您还可以通过使用嵌入时区数据库-tags timetzdata的方法。两种方法都会使程序的大小增加大约800 KB。

  • Cgo

Go 1.15会将C类型EGLConfig转换为Go类型uintptr。此更改类似于Go 1.12和更高版本EGLDisplay,Darwin的CoreFoundation和Java的JNI类型的方式。有关更多信息,请参见cgo文档(https://tip.golang.org/cmd/cgo/#hdr-Special_cases)。

  • 弃用X.509 CommonName

X.509证书上Subject Alternative Names不存在,而使用CommonName作为主机名的行为,这种过时行为现在被禁用。也可以通过添加x509ignoreCN=0到GODEBUG 环境变量来临时重新启用它。

请注意,如果CommonName主机名无效,则无论GODEBUG设置如何,都将始终忽略该主机名。无效名称包括那些带有字母,数字,连字符和下划线以外的任何字符的名称,以及带有空标签或结尾点的名称


最近发表
标签列表