
今天我很高兴宣布,Go+ v1.1 正式版发布了。这是一个大版本。借这个机会,我们会完整聊一聊,与 Go+ v1.0 相比,Go+ v1.1 的改进都是些什么?Go+ v1.0 分支的最新版本是 Go+ v1.0.39。而 Go+ v1.1 分支是从 2021 年 12 月 24 日开始,到今天已经半年多,一直处于测试版状态(经历了 alpha、beta、rc 三个阶段),可以说是 Go+ 经历的最长的一个测试期。为什么 Go+ v1.1 的测试期那么久?这主要还是它要解决的都是一些影响面比较大(容易对其它功能产生影响,所以我们选择了谨慎处理)硬骨头:我们整理了 Go+ v1.1.0 在 Go+ v1.0.39 基础上的改进明细,如下。其一,Go+ v1.1 引入了 github.com/goplus/mod 模块。这个模块提供了 Go/Go+ module 相关能力的支持。它可以认为是对 golang.org/x/mod 的增强,这些增强包括:- github.com/goplus/mod:提供查找 go.mod / gop.mod 文件的能力。
- github.com/goplus/mod/modfile:提供对 gop.mod 文件的读写支持。
- github.com/goplus/mod/{modload, gopmod}: 提供了 Go+ Module 类(推荐使用 gopmod 包,它在 modload 基础上做了较大程度的增强)。
- github.com/goplus/mod/modcache:提供对模块缓存目录支持。
- github.com/goplus/mod/modfetch:提供了模块下载功能。
其二,Go+ v1.1 对 gop mod(模块管理)相关的命令进行了完善,尤其是 gop mod tidy 命令需要考虑的情形较多。其三,Go+ v1.1 对 gop build/install/run/test 等命令功能的完备性做了增强,这主要表现在:- 对远程包的支持。例如,在 Go+ v1.0 中你只能 gop run 本地目录或文件,现在支持直接 gop run 来运行一个远程包。
- gop build/install/run/test 的一致性。之前 gop run 和 gop build/install 的代码各写各的,缺少一个统一的支持框架,彼此之间行为会有所差别,现在统一到了相同的实现框架。
- 消除了 gop cache 缺陷。在 Go+ v1.0 中由于 import 包的实现性能较差,所以引入了 gop cache 模块缓存,导致了一些模块更新检测上的 bug,以及 import 一些复杂的包会出现死循环的情形。
其四,Go+ v1.1 增加了一些 v1.0 没有的语法特性。这主要包括:- 支持 type() 表示类型 type 的零值。例如,string() 等价于 "",int32() 等价于 int32(0) 等等。
其五,Go+ v1.1 增加了对结构体及函数头部的注释指令的支持。例如://go:notinheaptype S struct{ x int }
//go:noinline//go:uintptrescapesfunc test(s string, p, q uintptr, rest ...uintptr) int { ...}
当然,注释指令这块还有待进一步完善。例如条件编译指令、代码行号指示等,当前都还没有实现。其六,修复了不少 bug。这包括 Go+ 语法上的 bug(包括 issue #888, #1056, #1228, #1243 等),以及 go1.8 版本新增了很多测试案例,在 Go+ v1.0 版本未必能够全部通过,我们在 v1.1 版本一一进行了修复(包括 issue #1195, #1196, #1197, #1198 等)。其七,支持 Go/Go+ 混合工程。详细可以参考 gop/testdata/mixgo 这个样例。以下是该工程的 README 文件中对此的介绍:- gop c 命令(等价于单独的 c2go 命令),可用于将 C 工程转换为 Go 工程。
- import "C" 及 import "C/xxx" 用于 import 一个通过 c2go 转换的 C 工程。其中,import "C" 是 import "C/github.com/goplus/libc" 的缩写。
当然,当前 Go+ 对 C 的支持只能算预览版,并没有达到真正工程上可用的程度。就单以 libc 来说,当前的迁移进度大约只有 5% 左右,还只是开了个头。而在接下来即将开始的 Go+ v1.2 版本规划中,对 C 支持的完备被列为了头等大事。当然包括 cgo 以及 Go 模板的支持,也都在规划之中,属于 Go/Go+ 混合工程至关重要的能力增强。