【golang学习笔记】——(五)Go格式化统一代码风格
我们在入职一家新公司的时候,除了要学习公司的流程规范和规章制度,还会做的一件事情就是进行公司编码规范的学习,基于google的C++规范下,做了各自的发散和规范,久而久之就是包罗万象的样子,疲于应付各种规范约束,但是代码的规范统一是有必要的,至少从代码的可读性和干净度上是让人舒适的,否则会很头大。go语言为了能减少因为代码风格不统一而专门制作了一个开发工具gofmt,这个工具可以将开发的源码格式化成符合官方制定的统一代码风格。对于go的开发者来说,每次提交开发的源码之前进行一次格式化是一个好的开发习惯。如果接收一个已经开发中或者开发完成的项目,晦涩难读的代码让你很难到达高效的熟悉代码和业务,那先进行gofmt会是一个很好的解决办法。
1、gofmt参数
usage: gofmt [flags] [path ...]
-cpuprofile stringwrite cpu profile to this file
-d display diffs instead of rewriting files
-e report all errors (not just the first 10 on different lines)
-l list files whose formatting differs from gofmt's
-r string
rewrite rule (e.g., 'a[b:len(a)] -> a[b:]')
-s simplify code
-w write result to (source) file instead of stdout
-cpuprofile :将CPU配置文件写入该文件
-d:只把改写前后内容的对比信息作为结果打印到标准输出。而不是把改写后的全部内容都打印到标准输出。
-e: 打印所有的语法错误到标准输出。如果不使用此标记,则只会打印每行的第 1 个错误且只打印前 10 个错误。
-l:仅把那些不符合格式化规范的、需要被命令程序改写的源码文件的绝对路径打印到标准输出。而不是把改写后的全部内容都打印到标准输出。
-r:添加形如“a[b:len(a)] -> a[b:]”的重写规则。如果我们需要自定义某些额外的格式化规则,就需要用到它。
-s:简化文件中的代码。
-w:把改写后的内容直接写入到文件中,而不是作为结果打印到标准输出。
2、gofmt的使用
2.1 对文件的格式化
将文件进行格式化后写入到文件
gofmt -w test.go
同时该命名还支持模糊匹配,
gofmt -w *.go
将当前目录下所有的.go源文件进行格式化并写入文件。
但是要注意,gofmt只能帮助让合法的代码规范化,并不能解决在编码中的错误语法。
例如有如下代码:
package main
import "fmt"
func main()
{
fmt.Println("hello word!")
}
L4行的'{'按照编码规范要求必须放到L3行的main函数声明后,但是当前的编码是错误的,如果执行gofmt命令进行格式化,则会报错:
C:\\project\\hello.go:6:1: unexpected semicolon or newline before {
对目录的格式化:
对goproject目录下包含其子目录下所有的.go源文件进行格式化并重写
gofmt goproject
重写规则的使用:
例如有如下代码:
package mainimport "fmt"func main() {a := 1b := 2c := a + bfmt.Println(c)}
执行-r重写规则
gofmt -w -r "a + b -> b + a" test.go
或
gofmt -r "a + b -> b + a" -w test.go
则代码会变成
package mainimport "fmt"func main() {a := 1b := 2c := b + afmt.Println(c)}
这里需要注意gofmt的参数执行是有规则的,不能是只把需要的参数直接在后面累加输入就可以正确执行的,如果输入为:
gofmt -r -w "a + b -> b + a" test.go
会报如下错误:
rewrite rule must be of the form 'pattern -> replacement'
且要注意gofmt 使用 tab 来表示缩进,对行的长度无限制,如果手动对代码进行了换行,gofmt 不会强制把代码格式化回一行,保持原来手动换行的现状,
例如手动换行如下代码为:
fmt.Println("hello word!")
换行为:
fmt.Println
("hello word!")
执行格式化后任然是:
fmt.Println
("hello word!")