[TOC] # 简介 gofmt默认不对代码进行简化,使用-s参数可以开启简化代码功能,具体来说会进行如下的转换: * 去除数组、切片、Map初始化时不必要的类型声明: ~~~ 如下形式的切片表达式:     []T{T{}, T{}} 将被简化为:     []T{{}, {}} ~~~ * 去除数组切片操作时不必要的索引指定 ~~~ 如下形式的切片表达式:     s[a:len(s)] 将被简化为:     s[a:] ~~~ * 去除迭代时非必要的变量赋值 ~~~ 如下形式的迭代:     for x, _ = range v {...} 将被简化为:     for x = range v {...} 如下形式的迭代:     for _ = range v {...} 将被简化为:     for range v {...} ~~~ # 命令 在命令行输入`gofmt –w program.go`会格式化该源文件的代码然后将格式化后的代码覆盖原始内容(如果不加参数`-w`则只会打印格式化后的结果而不重写文件);`gofmt -w *.go`会格式化并重写所有 Go 源文件;`gofmt map1`会格式化并重写 map1 目录及其子目录下的所有 Go 源文件。 `gofmt`也可以通过在参数`-r`后面加入用双引号括起来的替换规则实现代码的简单重构,规则的格式:`<原始内容> -> <替换内容>`。 实例: ~~~go gofmt -r '(a) -> a' –w *.go ~~~ 上面的代码会将源文件中没有意义的括号去掉。 ~~~go gofmt -r 'a[n:len(a)] -> a[n:]' –w *.go ~~~ 上面的代码会将源文件中多余的`len(a)`去掉。(**译者注:了解切片(slice)之后就明白这为什么是多余的了**) ~~~go gofmt –r 'A.Func1(a,b) -> A.Func2(b,a)' –w *.go ~~~ 上面的代码会将源文件中符合条件的函数的参数调换位置。 # ide配置 在Goland中,可以通过添加一个File Watcher来在文件发生变化的时候调用gofmt进行代码格式化,具体方法是,点击Preferences -> Tools -> File Watchers,点加号添加一个go fmt模版,Goland中预置的go fmt模版使用的是go fmt命令,将其替换为gofmt