Golang使用gofumpt进行代码格式化

 更新时间:2024年02月19日 10:26:39   作者:脑子进煎鱼了  
这篇文章主要为大家详细介绍了Golang如何使用gofumpt进行代码格式化,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

我们从一开始写 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 是非常不错的。(也需要引导这位同学,但容易撕逼)

像是前面提到的 “多行顶层声明必须用空行隔开” 是非常有价值的。我是真的见过一大坨不加空行都挤一起的。看起来非常难受。

到此这篇关于Golang使用gofumpt进行代码格式化的文章就介绍到这了,更多相关Go gofumpt格式化代码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • GO制作微信机器人的流程分析

    GO制作微信机器人的流程分析

    这篇文章主要介绍了利用go制作微信机器人,本文主要包括项目基础配置及详细代码讲解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • Golang实现DFA算法对敏感词过滤功能

    Golang实现DFA算法对敏感词过滤功能

    DFA算法是确定性有限自动机,其特征是,有一个有限状态集合和一些从一个状态通向另一个状态的边,每条边上标记有一个符号,通俗的讲DFA算法就是把你要匹配的做成一颗字典树,然后对你输入的内容进行匹配的过程,本文将利用DFA算法实现敏感词过滤,需要的可以参考一下
    2023-10-10
  • 深入理解Go语言设计模式之函数式选项模式

    深入理解Go语言设计模式之函数式选项模式

    在 Go 语言中,函数选项模式(Function Options Pattern)是一种常见且强大的设计模式,用于构建可扩展、易于使用和灵活的 API,本文就来看看它的具体用法吧
    2023-05-05
  • Go语言如何实现TCP通信详解

    Go语言如何实现TCP通信详解

    go里面实现tcp没有像之前写的C++那些那么麻烦,在C++里面要先创建套接字,然后绑定ip地址,go里面直接就一个函数建立套接字,然后在进行通信就可以了,下面这篇文章主要给大家介绍了关于Go语言如何实现TCP通信的相关资料,需要的朋友可以参考下
    2023-01-01
  • Go语言获取系统性能数据gopsutil库的操作

    Go语言获取系统性能数据gopsutil库的操作

    这篇文章主要介绍了Go语言获取系统性能数据gopsutil库的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 浅析Go语言版本的forgery

    浅析Go语言版本的forgery

    使用过Python语言的朋友们可能使用过 forgery_py ,它是一个伪造数据的工具。这篇文章主要介绍了Go语言版本的forgery,需要的朋友可以参考下
    2018-08-08
  • golang实现京东支付v2版本的示例代码

    golang实现京东支付v2版本的示例代码

    这篇文章主要介绍了golang实现京东支付v2版本,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • golang通用的grpc http基础开发框架使用快速入门

    golang通用的grpc http基础开发框架使用快速入门

    这篇文章主要为大家介绍了golang通用的grpc http基础开发框架使用快速入门详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Go语言每天必学之switch语句

    Go语言每天必学之switch语句

    这篇文章主要为大家详细介绍了Go语言每天必学之switch语句的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • Go语言数据结构之二叉树必会知识点总结

    Go语言数据结构之二叉树必会知识点总结

    如果你是一个开发人员,或多或少对树型结构都有一定的认识。二叉树作为树的一种,是一种重要的数据结构,也是面试官经常考的东西。本文为大家总结了一些二叉树必会知识点,需要的可以参考一下
    2022-08-08

最新评论