网站首页 > 技术文章 正文
更多互联网新鲜资讯、工作奇淫技巧关注原创【飞鱼在浪屿】(日更新)
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设置如何,都将始终忽略该主机名。无效名称包括那些带有字母,数字,连字符和下划线以外的任何字符的名称,以及带有空标签或结尾点的名称
猜你喜欢
- 2024-10-03 Spring Boot API 如何获得 JSON 数据
- 2024-10-03 大白话 golang 教程-20-使用 RPC 远程调用
- 2024-10-03 掌握 Postman 工具发送请求的简易教程
- 2024-10-03 python接口自动化-Json数据处理(python接口自动化流程)
- 2024-10-03 python接口自动化(八)--发送post请求的接口(详解)
- 2024-10-03 Flink 在唯品会的实践(唯品会 分析)
- 2024-10-03 web开发之-ajax的基本使用(处理json数据)
- 2024-10-03 Java POST JSON 数据处理异常 (code 160)): was expecting double-quote
- 2024-10-03 使用Postman发送POST请求的指南(postman如何发送post请求)
- 2024-10-03 在Postman脚本中发送请求(pm.sendRequst)
- 02-21走进git时代, 你该怎么玩?_gits
- 02-21GitHub是什么?它可不仅仅是云中的Git版本控制器
- 02-21Git常用操作总结_git基本用法
- 02-21为什么互联网巨头使用Git而放弃SVN?(含核心命令与原理)
- 02-21Git 高级用法,喜欢就拿去用_git基本用法
- 02-21Git常用命令和Git团队使用规范指南
- 02-21总结几个常用的Git命令的使用方法
- 02-21Git工作原理和常用指令_git原理详解
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)