Golang 更严格的代码格式化工具 gofumpt

本文介绍了gofumpt,一个基于gofmt的代码格式化工具,它提供了更严格的规则并保持与gofmt兼容。文章详细列出了gofumpt的特点、安装方法以及使用示例,展示了gofumpt如何改进代码的可读性和一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

一、前言

gofmt 是 golang 自带的代码自动格式化工具,是保证 Go 代码风格一致的大杀器。我们这次要推荐的 gofumpt 在 gofmt 的基础上添加了一系列更加严格的格式化规则,并保证了对
gofmt 的兼容。

二、gofumpt 简介

gofumpt(https://github.com/mvdan/gofumpt) fork 自 gofmt,支持与 gofmt 几乎相同的命令行参数,因此可以作为 gofmt 的直接替代品使用。gofumpt 是
gofmt 的"超集",经过 gofumpt 格式化的代码也符合 gofmt 的要求,其本身所扩展的格式化规则也可能在后续被集成进 gofmt。

gofumpt 有以下特点:

  • 更多的格式化规则(参见 https://github.com/mvdan/gofumpt#Added-rules)
  • 默认跳过对 vendor 的格式化
  • 不对自动生成的代码应用扩展规则
  • 不支持 -r 参数

三、安装、使用命令

安装命令:

go install mvdan.cc/gofumpt@latest

执行命令:

gofumpt -l -w .

四、使用举例

赋值运算符后面没有空行

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

改为 gofumpt 格式化后:

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

函数体周围没有空行

Example
func foo() {

println("bar")

}

改为 gofumpt 格式化后:

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

函数应分隔 ‘) {’,其中缩进有助于可读性

Example
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")
}

改为 gofumpt 格式化后:

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")
}

块中单个语句 (或注释) 周围没有空行

Example
if err != nil {

return err
}

改为 gofumpt 格式化后:

if err != nil {
return err
}

在简单的错误检查之前没有空行

Example
foo, err := processFoo()

if err != nil {
return err
}

改为 gofumpt 格式化后:

foo, err := processFoo()
if err != nil {
return err
}

复合文字应一致地使用换行符

Example
// 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,
},
}

改为 gofumpt 格式化后:

var ints = []int{
1, 2,
3, 4,
}

var matrix = [][]int{
{1},
{2},
{
3,
},
}

空字段列表应使用单行

Example
var V interface {
} = 3

type T struct {
}

func F()

改为 gofumpt 格式化后:

var V interface{} = 3

type T struct{}

func F()

std 导入必须位于顶部的单独组中

Example
import (
"foo.com/bar"

"io"

"io/ioutil"
)

改为 gofumpt 格式化后:

import (
"io"
"io/ioutil"

"foo.com/bar"
)

简短的case子句应采用单行

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

改为 gofumpt 格式化后:

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

多行顶级声明必须用空行分隔

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

改为 gofumpt 格式化后:

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

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

单个var声明不应使用括号分组

Example
var (
foo = "bar"
)

改为 gofumpt 格式化后:

var foo = "bar"

连续的顶级声明应该组合在一起

Example
var nicer = "x"
var with = "y"
var alignment = "z"

改为 gofumpt 格式化后:

var (
    nicer = "x"
    with = "y"
    alignment = "z"
)

简单的var声明语句应该使用短赋值

Example
var s = "somestring"

改为 gofumpt 格式化后:

s := "somestring"

默认情况下启用 ‘-s’ 代码简化标志

Example
var _ = [][]int{[]int{1}}

改为 gofumpt 格式化后:

var _ = [][]int{{1}}

八进制整数文字应在使用Go 1.13及更高版本的模块上使用 ‘0o’ 前缀

Example
const perm = 0755

改为 gofumpt 格式化后:

const perm = 0o755

不是Go指令的注释应该以空格开头

Example
//go:noinline

//Foo is awesome.
func Foo() {}

改为 gofumpt 格式化后:

//go:noinline

// Foo is awesome.
func Foo() {}

复合文字不应具有前导或尾随空行

Example
var _ = []string{

"foo",

}

var _ = map[string]string{

"foo": "bar",

}

改为 gofumpt 格式化后:

var _ = []string{
"foo",
}

var _ = map[string]string{
"foo": "bar",
}

字段列表不应有前导或尾随空行

Example
type Person interface {

Name() string

Age() int

}

type ZeroFields struct {

// No fields are needed here.

}

改为 gofumpt 格式化后:

type Person interface {
Name() string

Age() int
}

type ZeroFields struct {
// No fields are needed here.
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ch3nnn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值