gofumpt比gofmt更严格代码格式化策略。它是gofmt的一个子集。同时gofumpt向后兼容。
该工具是 Go 1.22 版本的 gofmt 的一个分支,需要 Go 1.21 或更高版本。
Vendor 和 testdata 目录将被跳过,除非作为显式参数给出。生成的 Go 文件也是如此。
使用
# 安装 |
vscode 配置
gopls使用gofumpt
"go.useLanguageServer": true, |
Goland 配置
- 打开 Settings (File > Settings)
- 打开 Tools 项
- 找到 File Watchers 子项
- 单击右侧的
+来添加一个新的文件监视器 - 选择自定义模板 在新窗口中继续操作
- File Types:选择
all .go files - Scope: Project Files
- Program:选择
gofumpt可执行文件 - Arguments:
-w $FilePath$ - Output path to refresh:
$FilePath$ - Working directory:
$ProjectFileDir$ - 环境变量:
GOROOT=$GOROOT$;GOPATH=$GOPATH$;PATH=$GoBinDirs$
为了避免不必要的运行,您应该禁用“高级”部分中的所有复选框。
新增的规则
在赋值操作后不换行
func foo() {
foo :=
"bar"
}func foo() {
foo := "bar"
}函数体上下不换行
func foo() {
println("bar")
}func foo() {
println("bar")
}函数应该分隔
){,其中缩进有助于可读性func foo(s string,
i int) {
println("bar")
}
// With an empty line it's slightly better, but still not great.
func bar(s string,
i int) {
println("bar")
}func foo(s string,
i int,
) {
println("bar")
}
// With an empty line it's slightly better, but still not great.
func bar(s string,
i int,
) {
println("bar")
}代码块中单条语句或注释不空行
if err != nil {
return err
}if err != nil {
return err
}在简单的错误检查之前没有空行
foo, err := processFoo()
if err != nil {
return err
}foo, err := processFoo()
if err != nil {
return err
}复合文字应该一致地使用换行符
// A newline before or after an element requires newlines for the opening and
// closing braces.
var ints = []int{1, 2,
3, 4}
// A newline between consecutive elements requires a newline between all
// elements.
var matrix = [][]int{
{1},
{2}, {
3,
},
}var ints = []int{
1, 2,
3, 4,
}
var matrix = [][]int{
{1},
{2},
{
3,
},
}空字段列表应该使用一行
var V interface {
} = 3
type T struct {
}
func F(
)var V interface{} = 3
type T struct{}
func F()标准库的导入应该是顶部单独的一组
import (
"foo.com/bar"
"io"
"io/ioutil"
)import (
"io"
"io/ioutil"
"foo.com/bar"
)短的 case 判断应该在一行内处理
switch c {
case 'a', 'b',
'c', 'd':
}switch c {
case 'a', 'b', 'c', 'd':
}多行顶级声明必须用空行分隔
func foo() {
println("multiline foo")
}
func bar() {
println("multiline bar")
}func foo() {
println("multiline foo")
}
func bar() {
println("multiline bar")
}单条变量声明不应该使用圆括号
var (
foo = "bar"
)var foo = "bar"
连续的顶级声明应该组合在一起
var nicer = "x"
var with = "y"
var alignment = "z"var (
nicer = "x"
with = "y"
alignment = "z"
)简单的 var 声明语句应该使用短赋值
var s = "somestring"s := "somestring"
默认情况下启用
-s代码简化标志var _ = [][]int{[]int{1}}
var _ = [][]int{{1}}
八进制整数字面值应该在使用 Go 1.13 及更高版本的模块上使用
0o前缀const perm = 0755
const perm = 0o755
不是 Go 指令的注释应该以空格开头
//go:noinline
//Foo is awesome.
func Foo() {}//go:noinline
// Foo is awesome.
func Foo() {}复合文字不应该有开头或结尾的空行
var _ = []string{
"foo",
}
var _ = map[string]string{
"foo": "bar",
}var _ = []string{
"foo",
}
var _ = map[string]string{
"foo": "bar",
}字段列表不应该有开头或结尾的空行
type Person interface {
Name() string
Age() int
}
type ZeroFields struct {
// No fields are needed here.
}type Person interface {
Name() string
Age() int
}
type ZeroFields struct {
// No fields are needed here.
}相邻的相同类型的参数应分组在一起
这个规则需要使用-extra。该规则对简单参数使用效果不错,但是复杂参数使用是容易造成误读。按需使用即可。func Foo(bar string, baz string) {}
func Foo(bar, baz string) {}
- 本文作者: Tiny Beer
- 本文链接: https://tinybeer.github.io/2024/05/24/gofumpt/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!
