目录

GO 1.13版本改进

Go1.13 版本在 Go1.12 发布六个月后推出。它的大部分变化都在工具链(toolchain),运行时(runtime)和库的实现。从  Go1.13 开始,在Go1.11开始酝酿的诸多决定终于开始逐个生效:首先是模块化将成为默认的特性,彻底告别GOPATH时代;其次是不是太重要的二进制特性将被废除;最后是语言的进化将再次启动,一些细微的语言特性将在Go2到来之前被提前实现。

在2018年官方已经发布了 Go2 的设计草案,其中包含了令人惊喜的范型和错误等诸多改进,在后 Go1 时代过去之后将是新兴的 Go2 时代。需要说明的是,Go2 的诞生并不表示 Go1 被抛弃!如何避免 Python3 的笑话正是 Go2 第一要考虑的问题,因此才会有 Go1.11 到 Go2 逐步过段的阶段。而 Go 语言官方也已经通过博文承诺 Go2 将保持对 Go1 软件资产的最大兼容,开发者采用增量更新的方式将 Go1 逐渐过渡到 Go2,这个进程主要由社区来负责驱动,只要不会带来向后不兼容的问题,每个 Go 2 的提议都有可能会在更早的版本发布出来。

根据官方文档整理1.13版本变化。

1.语法糖

  • 二进制整数字面量:前缀 0b 或 0B 表示二进制整数字面量,例如 0b1011;
  • 八进制整数字面量:前缀 0o 或 0O 表示八进制整数字面量,例如 0o660(由前导 0 后跟八进制数字指示的八进制表示法仍然有效);
  • 十六进制浮点数字面量:现在可以使用前缀 0x 或 0X 来表示十六进制格式浮点数,例如 0x1.0p-1021。十六进制浮点数必须始终具有指数,写为字母 p 或 P,后跟十进制的指数。指数将尾数运算为2的指数幂。例 0x1p-2,代表十六进制的 1 除以 2²,也就是 0.25;
  • 虚部(复数常数的虚部)字面量:虚部后缀 i 现在可以与任何(二进制,十进制,十六进制)整数或浮点字面值一起使用,例如:0xabci == 0xabc * 1i == 2748i 。
  • 数字分隔符:现在可以使用下划线分隔(分组)任何数字字面量,例如 1_000_000、0b_1010_0110、3.1415_9265,下划线可能出现在任何两位数字或字面量前缀和第一位数字之间。

2.工具

Modules 改进

GO111MODULE 环境变量默认值仍为 auto,但只要当前工作目录包含或位于包含 go.mod 文件的目录下,auto 就会激活 go command 模块感知模式——即使当前目录在 GOPATH/src 内。

此变更简化了 GOPATH/src 中现有代码的迁移,以及对模块感知软件包与非模块感知导入器的持续维护。

GOPROXY 环境变量现在可以设置为以逗号分隔的代理 URL 列表或特殊的token值 direct,其默认值现为https://proxy.golang.org,direct。解析包含其模块的包路径时,go命令将连续尝试列表中每个代理上的所有候选模块路径。除404、410之外,无法访问的代理或 HTTP 状态代码将使搜索终止,而无需咨询其余代理。

GOPRIVATE(new) 环境变量用于声明不公开的模块路径。用作较低优先级的 GONOPROXY 和GONOSUMDB 变量的默认值,通过代理提取哪些模块并使用校验和数据库进行验证,从而提供更精细的操控。

GOSUMDB(new) 环境变量可标识数据库的名称、可选的公钥和服务器 URL,以查询主模块的go.sum文件中尚未列出的模块的校验和。如果 GOSUMDB 不包含显式 URL,则通过检索支持校验和数据库的 GOPROXY URL来选择 URL,如果所有代理都不支持,则返回到指定数据库的直接连接。如果GOSUMDB设置为off,则不会查询校验和数据库,只验证 go.sum 文件中的现有校验和。

若用户无法访问默认代理和校验和数据库(例如由于防火墙配置)可将 GOPROXY设置为 dircet和/或将 GOSUMDB 设置为 off 。

go env -w 指令可用于设置这些变量的默认值,全平台通用:

1
2
go env -w GOPROXY=direct
go env -w GOSUMDB=off