大家好,我是煎鱼。

咱们从一开始写 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 {} = 3type T struct {}func F()

改为 gofumpt 格式化后:

var V interface{} = 3type 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 库,更快更规范!