戈夫特
围棋项目最具争议的方面之一Go有一个规范的程序格式,实现了通过程序(戈夫特
)能捡到任何东西去编程并以规范格式重新格式化它。Go源代码树中的每个程序都已格式化与gofmt合作。代码审查和修订控制工具检查所有新代码是否也是gofmt格式的。
(我避免使用“风格”这个词,因为gofmt没有强制执行风格,在某种意义上编程风格的要素.通过gofmt更改运行代码布局,但不是它是否是一个写得好、优雅的程序。随着风格的提升,引用这些平凡的格式规则它们远远超出了它们的重要性。gofmt强加的唯一风格是一致性。)
使用gofmt最明显的好处是打开一个陌生的围棋程序,你的大脑甚至不会分心下意识地,为什么那个支架放错了地方;你可以专注于代码,而不是格式。但是gofmt还有很多有趣的用途。Gofmt可以获取Go源代码树中的任何文件,将其解析为内部表示,然后将完全相同的字节写回文件。这样做有两个原因:主要原因是gofmt付出了很多努力,但重要的次要原因是gofmt只需要担心关于一个格式约定,我们已经同意接受这个作为官方的。
一旦你有了一个可以解析和打印程序无损,易于插入机械加工在中间,在解析和打印之间转换程序。想改变语言吗?在gofmt中更改它并重新格式化源树。自公开发布以来,这已经发生了多次。
12月9日发布的Go增加了一个新的内置功能副本(dst,src)
从一个切片到另一个。(它是内置的,因为它是常见操作,因为Go缺少指针算术使得自己很难编写重叠检查。)新的复制
替换了库例程字节。复制
,类似但只在字节片上工作。
Gofmt有一个选项,-第页
,指定重写表单中的规则图案->更换
.在模式和替换中,单字母小写名称用作匹配任意表达式的通配符。想要从转换字节。复制
到复制
?
gofmt-w-r'字节。复制(d,s)->复制(d、s)'*.go
(-w标志将程序的新版本写回输入文件。)
12月9日的版本还增加了对写作的支持x[i:]
而不是x[i:len(x)]
.如果可能,想转换程序以使用新语法吗?
gofmt-w-r'x[i:len(x)]->x[i:]'*.go
这两个微小的变化被讨论所取代一个更大的句法变化是取消了行号。再一次,gofmt对实现转变至关重要。正在考虑的语法主要是,但不完全是,向后兼容当前版本的Go。通常,这意味着必须制作编译器在一段时间内支持这两种语法编译器可能会根据在旧语法上,希望用户修复他们的程序。相反,有一个工具的工作是重写程序意味着所有其他工具都可以专注于其他事情。Gofmt可以机械地修复程序,以及编译器和其他工具可以删除旧语法,而不必同时支持这两种语法。
我希望看到更多使用gofmt和它使用的库(go/解析器
和go/打印机
).例如,IDE插件没有理由不能位于同一位置库来构建有趣的重构工具。Gofmt的-第页
只是开始。这将是令人兴奋的。
最后一个注释。能够挑选创建一个程序并将其写回,保留注释,用任何语言来说都不是一件容易的事。Robert Griesemer应该为为了让gofmt能够很好地处理真实的程序,付出了巨大的努力。