乐趣区

关于后端:Go-更强的代码洁癖可以把-gofmt-给换了

大家好,我是煎鱼。

咱们从一开始写 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 库,更快更规范!
退出移动版