下一版本的Go在最基础的软件包方面将包含显著的API变更。除非进行更新,采用新版 API,否则将无法编译实现HTTP服务器句柄、调用net.Dial、调用os.Open及使用reflect软件包的代码。随着Go语言愈加稳定,发布频率减缓将成为常态。每周的快照版本中都会有API变更,部分可能能自动管理;然而,合计起来看,手动更新现有代码的工作量仍然非常地大。

Gofix是一款减轻更新现有代码工作量的新工具。它读取源文件中的程序,查找对旧版API的使用,用当前API进行改写,并将程序写回文件。有些API变更未保持全部原有功能,所以gofix的改写有时并不完美。当无法自动改写旧版API时,gofix将给出警告及文件名与所在行数,开发者可以检查并亲自重写代码。Gofix负责处理乏味冗长的简单变更,而把真正应该注意的部分留给开发者处理。

每当API有明显变更时 gofix的代码都会得到更新,并尽可能的进行自动转换。如果用户更新到新版 Go后代码无法编译,只需在源码目录运行一下Gofix。

例如,gofix可以将出自fmt/print.go的这段代码:


重写为采用新版 API 的代码:


几乎每行都有微小变更。重写的变更量大,但几乎完全机械化,可以交付计算机处理。

Gofix的实现离不开Go标准库中对将Go源文件解析为语法树与将语法树打印回为Go源代码的支持。此外,Go打印库能以官方格式(通常可以通过gofmt工具实现)打印程序,可让gofix对Go程序的机械性更改不造成谬误。实际上,设计gofmt的关键动机之一——或许仅次于避免特定花括号放置位置的争论——就是简化重写Go程序的工具,如gofix的设计。

Gofix注定成为不可或缺的工具。Go团队一直使用该工具更新他们自己的项目,甚至是更新Google内部的源码树。Gofix允许用户修复错误或重构包API而无须担心转换现有代码的开销。用户也可以对gofix进行扩展,来支持他们自己的API。

via : The Go Programming Language Blog


有疑问加站长微信联系(非本文作者)