新一代Go语言格式化工具:gofmt的完美替代者

发表时间: 2024-03-05 17:19

gofmt 是 golang 自带的代码自动格式化工具,是企业开发必用的代码格式化工具。但是今天的主角是gofumpt,比gofmt多了up,可以理解为他的升级版。


gofumpt的官网是GitHub - mvdan/gofumpt: A stricter gofmt。是从gofmt的基础上进行开发的。是gofmt的平替,具有更严格的格式化要求。

gofumpt的几个特点

第一个:默认跳过对 vendor 和testdata的格式化

第二个:不支持 -r 参数

第三个:更多的格式化规则



快速使用

第一步:安装

go install mvdan.cc/gofumpt@latest


规则列举

第一个:赋值运算符后不能有空行

func foo() {    foo :=        "bar"}

格式化后

func foo() {	foo := "bar"}

这样可以防止有些人觉得遗憾代码太长带来的自己的断行行为。


第二个:简单的错误检查之前不能有空行

package testfoo, err := doSomethingHappy()if err != nil { return err}

格式化后

package testfoo, err := doSomethingHappy()if err != nil { return err}


第三个:函数体不能用空行

func doSomethingHappy() {	println("doSomethingHappy")}

格式化后

func doSomethingHappy() {	println("doSomethingHappy")}


第四个:标准库的导入必须位于顶部的单独组中

package testimport ( "foo.com/bar" "io" "io/ioutil")

格式化后

package testimport ( "io" "io/ioutil" "foo.com/bar")


第五个:没有字段的结构体/接口的写法

var V interface {} = 3type Base struct {}func BaseFunction()

格式化后

var V interface{} = 3type Base struct{}func BaseFunction()


第六个:短的case判断写在一行

switch c {case 'a', 'b',	'c', 'd':}
switch c {case 'a', 'b', 'c', 'd':}


第七个:多个顶级的声明之间用逗号隔开

func foo() {	println("multiline text")}func bar() {	println("multiline text")}
func foo() {	println("multiline text")}func bar() {	println("multiline text")}


第八个:单个变量声明不用括号

var (	foo = "bar")
var foo = "bar"


第九个:简单的变量定义用简写的方式

var s = "somestring"
s := "somestring"


第十个:注释要先加一个空格

//DoIt is something that i do.func DoIt() {}
// DoIt is something that i do.func DoIt() {}


Goland使用gofumpt

手动格式化

在终端执行

gofumpt -l -w .


自动格式化

第一步:安装File Watcher 插件

第二步:点击 Settings -> Tools -> File Watchers,然后添加一个 gofumpt 工具,然后OK,这样以后文件每次保存时则会自动触发代码格式化。