《Go语言精进之路》读书笔记 | 提交前使用gofmt格式化源码

Posted COCOgsta

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《Go语言精进之路》读书笔记 | 提交前使用gofmt格式化源码相关的知识,希望对你有一定的参考价值。

书籍来源:《Go语言精进之路:从新手到高手的编程思想、方法和技巧》

一边学习一边整理读书笔记,并与大家分享,侵权即删,谢谢支持!

附上汇总贴:《Go语言精进之路》读书笔记 | 汇总_COCOgsta的博客-CSDN博客


自从现代编程语言出现以来,针对每种编程语言的代码风格的争论就不曾停止过,直到Go语言的出现,人们才惊奇地发现Go社区似乎很少有针对Go语言代码风格的争论。

6.1 gofmt:Go语言在解决规模化问题上的最佳实践

gofmt是伴随着Go语言的诞生而在“规模化”这个目标上进行的第一批实践和尝试。gofmt先入为主地将一种统一的代码风格内置到Go语言之中,并将其与Go语言一起以一种“标准”的形式推广给所有Go开发者。

在一致的代码风格下,Go开发人员阅读和维护他人代码时不再感到陌生,效率也变得更高了,gofmt的代码风格成为了所有人的最爱,以至于在Go的世界里代码风格已经没有了存在感。

多数Go开发者可能说不出gofmt代码风格是什么样的,因为代码会被gofmt自动变成那种风格,大家已经不再关心风格。

6.2 使用gofmt

gofmt最大的特点是没有提供任何关于代码风格设置的命令行选项和参数,这样Go开发人员就无法通过设置命令行特定选项来定制自己喜好的风格。不过gofmt却提供了对代码进行按格式查找、代码重构的命令行选项。

  1. 使用gofmt -s选项简化代码

存在一个字符串切片v:

v := []string...
复制代码

如果要迭代访问字符串切片v的各个元素,可以这么做:

for _ = range v 
    ...

复制代码

还可以这么做(Go 1.4及后续版本):

for range v 
    ...

复制代码

通过gofmt -s可以将遗留代码中的非简化代码自动转换为简化写法,“-s”选项是gofmt执行的默认选项。

  1. 使用gofmt -r执行代码“微重构”

可以通过-r命令行选项对代码进行表达式级别的替换,以达到重构的目的。

下面是-r选项的用法:

gofmt -r 'pattern -> replacement' [other flags] [path ...]
复制代码

gofmt -r的原理就是在对源码进行重新格式化之前,搜索源码是否有可以匹配pattern的表达式,如果有,就将所有匹配到的结果替换为replacement表达式。比如:

$gofmt -r 'a[3:len(a)] -> a[3:]' -w chapter2/sources/gofmt_demo.go
复制代码

上面gofmt -r命令执行的意图就是先将源码文件gofmt_demo.go中能与a[3:len(a)]匹配的代码替换为a[3:],然后重新格式化。因此上面的命令对下面的源码片段都可以成功匹配:

-   fmt.Println(s[3:len(s)])
+   fmt.Println(s[3:])

-   n, err := s.r.Read(s.buf[3:len(s.buf)])
+   n, err := s.r.Read(s.buf[3:])

-   reverseLabels = append(reverseLabels, domain[3:len(domain)])
+   reverseLabels = append(reverseLabels, domain[3:])
复制代码
  1. 使用gofmt -l按格式要求输出满足条件的文件列表

gofmt提供了-l选项,可以按格式要求输出满足条件的文件列表。比如,输出$GOROOT/src下所有不满足gofmt格式要求的文件列表:

$ gofmt -l $GOROOT/src
$GOROOT/src/cmd/cgo/zdefaultcc.go
$GOROOT/src/cmd/go/internal/cfg/zdefaultcc.go
$GOROOT/src/cmd/go/internal/cfg/zosarch.go
...
$GOROOT/src/go/build/zcgo.go
复制代码

我们也可以将-r和-l结合起来使用,输出匹配到pattern的文件列表。比如查找$GOROOT/src下能匹配到'a[b:len(a)]' pattern的文件列表:

$ gofmt -r 'a[b:len(a)] -> a[b:]' -l $GOROOT/src
$GOROOT/src/bufio/scan.go
$GOROOT/src/crypto/x509/verify.go
复制代码

6.3 使用goimports

对于源文件中没有使用但却导入了的包或使用了但没有导入的包,Go编译器都会报错。gofmt工具无法自动增加或删除文件头部的包导入列表。为此,Go核心团队实现了goimports。

goimports在gofmt功能的基础上增加了对包导入列表的维护功能,可根据源码的最新变动自动从导入包列表中增删包。

6.4 将gofmt/goimports与IDE或编辑器工具集成

日常开发工作中,Go开发人员多使用各种主流编辑器进行代码的编写、测试和重构工作,他们一般会将gofmt/goimports与编辑器集成,由编辑器在保存源文件时自动调用gofmt/goimports完成代码的格式化。

(1)Visual Studio Code

微软为Go提供了官方插件支持——vscode-go,vscode-go借助第三方工具实现了代码智能感知、代码导航、编辑、诊断、调试和单元测试等功能。

(2)Vim

Vim是很多做后端开发工作的开发者最喜欢的编辑工具。它也有一个强大的插件扩展机制,基于Vim插件我们便可以实现想要的各种功能。

Go和Vim通过vim-go插件连接在一起。

(3)GoLand

GoLand是知名IDE厂商JetBrains开发的Go语言IDE产品。

GoLand同样也是通过第三方工具(如gofmt/goimports)来实现对代码的格式化。在GoLand中,我们可以手动对文件或工程执行格式化,也可以创建File Watcher来实现在保存文件时对文件进行自动格式化。

以上是关于《Go语言精进之路》读书笔记 | 提交前使用gofmt格式化源码的主要内容,如果未能解决你的问题,请参考以下文章

《Go语言精进之路》读书笔记 | 使用defer让函数更简洁更健壮

《Go语言精进之路》读书笔记 | 汇总

《Go语言精进之路》读书笔记 | 使用一致的变量声明形式

《Go语言精进之路》读书笔记 | 使用无类型常量简化代码

《Go语言精进之路》读书笔记 | 使用iota实现枚举常量

《Go语言精进之路》读书笔记 | 使用Go语言原生编码思维来写Go代码