共计 2736 个字符,预计需要花费 7 分钟才能阅读完成。
大家好,我是煎鱼。
咱们从一开始写 Go 代码和利用,就会被各种官网和民间教程,甚至 IDE 教诲咱们必须配一个 Gofmt 工具。他可能格式化 Go 程序的代码。会应用制表符示意缩进,空白示意对齐。
这解决了程序员届的老大难问题之一,代码格局上的标准问题。无效的进步了 Go 代码的浏览的友好度和缩小了共事间的 **。十分值得认可。
但有时候,还是会看到一些糟心的代码,总会感觉 Gofmt,还是格式化的不够。
明天给大家分享我发现的一个更狠的工具:gofumpt,例子次要基于官网文档。
更强的格式化:gofumpt
Gofumpt 会执行比 gofmt 更严格的 Go 格局标准。同时确保向后兼容。
该工具是 Go 1.21 的 gofmt 分支,须要 Go 1.20 或更高版本。它能够间接代替现有的 Go 代码格式化,也就是在 gofumpt 之后运行 gofmt 不会产生任何新的变动。
装置命令:
$ go install mvdan.cc/gofumpt@latest
执行命令:
$ gofumpt -l -w .
main.go
再查看对应被格式化的文件就曾经失效了。
以下是一些更具体的 gofmt 和 gofumpt 的区别例子。可能很好的帮忙大家辨认其中的差别。
赋值运算符后无空行
本来由 gofmt 格式化后:
func foo() string {
foo :=
"脑子进煎鱼了!"
return foo
}
改为 gofumpt 格式化后:
func foo() string {
foo := "脑子进煎鱼了!"
return foo
}
函数体四周无空行
本来由 gofmt 格式化后:
func foo() {println("煎鱼进脑子了!")
}
改为 gofumpt 格式化后:
func foo() {println("煎鱼进脑子了!")
}
函数应分隔 ) {,缩进有助于进步可读性
本来由 gofmt 格式化后:
func foo(s string,
i int) {println("煎鱼!!!")
}
// 应用空行会略微好一些,但依然不够好
func bar(s string,
i int) {println("煎鱼!!!")
}
改为 gofumpt 格式化后:
func foo(s string,
i int,
) {println("煎鱼!!!")
}
func bar(s string,
i int,
) {println("煎鱼!!!")
}
代码块中的独自语句(或正文)四周没有空行
本来由 gofmt 格式化后:
if err != nil {return err}
改为 gofumpt 格式化后:
if err != nil {return err}
简略谬误查看前无空行
本来由 gofmt 格式化后:
foo, err := processFoo()
if err != nil {return err}
改为 gofumpt 格式化后:
foo, err := processFoo()
if err != nil {return err}
复合字面量应对立应用换行符
本来由 gofmt 格式化后:
var ints = []int{1, 2,
3, 4}
var matrix = [][]int{{1},
{2}, {3,},
}
改为 gofumpt 格式化后:
var ints = []int{
1, 2,
3, 4,
}
var matrix = [][]int{{1},
{2},
{3,},
}
空字段列表应应用单行
本来由 gofmt 格式化后:
var V interface {
} = 3
type T struct {
}
func F()
改为 gofumpt 格式化后:
var V interface{} = 3
type T struct{}
func F()
规范库导入必须在顶部独自分组
本来由 gofmt 格式化后:
import (
"foo.com/bar"
"io"
"io/ioutil"
)
改为 gofumpt 格式化后:
import (
"io"
"io/ioutil"
"foo.com/bar"
)
短 case 子句应占一行
本来由 gofmt 格式化后:
switch c {
case 'a', 'b',
'c', 'd':
}
改为 gofumpt 格式化后:
switch c {case 'a', 'b', 'c', 'd':}
多行顶层申明必须用空行隔开
本来由 gofmt 格式化后:
func foo() {println("煎鱼!")
}
func bar() {println("煎鱼!")
}
改为 gofumpt 格式化后:
func foo() {println("煎鱼!")
}
func bar() {println("煎鱼!")
}
单个 var 申明不应应用括号分组
本来由 gofmt 格式化后:
var (foo = "煎鱼!")
改为 gofumpt 格式化后:
var foo = "煎鱼!"
间断的顶层申明应归为一组
本来由 gofmt 格式化后:
var nicer = "x"
var with = "y"
var alignment = "z"
改为 gofumpt 格式化后:
var (
nicer = "x"
with = "y"
alignment = "z"
)
简略的 var 申明语句应应用短赋值
本来由 gofmt 格式化后:
var s = "煎鱼进脑子了"
改为 gofumpt 格式化后:
s := "煎鱼进脑子了"
默认启用 -s 代码简化标记。
非 Go 指令的正文应以空格结尾
本来由 gofmt 格式化后:
//go:noinline
//Foo is awesome.
func Foo() {}
改为 gofumpt 格式化后:
//go:noinline
// Foo is awesome.
func Foo() {}
VSCode 配置
能够间接在 IDE 中进行配置。例如 VSCode,能够配置对应的 settings.json 为如下:
{
"go.useLanguageServer": true,
"gopls": {"formatting.gofumpt": true,},
}
就能够间接在 Go 利用中用起来了。
总结
之前我有一个敌人,接手了一个老我的项目。那位同学,简直没有什么代码标准的格调。全靠 gofmt 来帮他格式化。
但你们也看到,gofmt 只做了最根本的。这种时候如果有更严格的 Go 代码格式化工具 gofumpt 是十分不错的。(也须要疏导这位同学,但容易撕逼)
像是后面提到的“多行顶层申明必须用空行隔开”是十分有价值的。我是真的见过一大坨不加空行都挤一起的。看起来十分好受。
心愿这个更严格的 gofumpt,对大家格式化 Go 代码能有所帮忙!
文章继续更新,能够微信搜【脑子进煎鱼了】浏览,本文 GitHub github.com/eddycjy/blog 已收录,学习 Go 语言能够看 Go 学习地图和路线,欢送 Star 催更。
举荐浏览
- Go1.22 新个性:加强 http.ServerMux 路由能力,将有更强的表现力!
- Go1.22 新个性:for 循环不再共享循环变量,且反对整数范畴
- 为什么 Go1.22 for 循环要反对整数范畴?
- Go1.22 新个性:Slices 变更 Concat、Delete、Insert 等函数,对开发挺有帮忙!
- Go1.22 新个性:新的 math/rand/v2 库,更快更规范!