• Go代码格式化——gofmt的使用


    gofmt使用

    对于一门编程语言来说,代码格式化是最容易引起争议的一个问题,不同的开发者可能会有不同的编码风格和习惯,但是如果所有开发者都能使用同一种格式来编写代码,开发者就可以将宝贵的时间专注在语言要解决的问题上。

    ​ Golang的开发团队制定了统一的官方代码风格,并且推出了gofmt工具(gofmt或go fmt)来帮助开发者格式化他们的代码到统一的风格。

    ​ Gofmt格式化Go程序。它使用制表符进行缩进,使用空格进行对齐。如果没有显式路径,它将处理标准输入。给定一个文件,它对文件进行操作;给定一个目录,它递归地操作该目录中的所有.go文件。(忽略以句点开头的文件。)

    默认情况下,gofmt将重新格式化的源打印到标准输出。

    有关gofmt的更多信息,请参见“go doc cmd/gofmt”。
    
    用法:
        gofmt [flags] [path ...]
    
    The flags are:
      	-cpuprofile string
            将CPU配置文件写入此文件
        -d
            不将重新格式化的源打印到标准输出。
    		如果一个文件的格式与gofmt的不同,则将差异部分打印到标准输出。
        -e
            打印所有(包括虚假)错误。
        -l
            不将格式化的源打印到标准输出。
    		如果文件的格式与 gofmt 不同,则将其名称打印到标准输出。
        -r rule(string)
            在重新格式化之前,对源应用重写规则(例如,'a[b:len(a)] -> a[b:]')
        -s
            尝试简化代码(在应用重写规则后,如果有的话)。
        -w
           	不将重新格式化的源打印到标准输出。
           	如果文件的格式与 gofmt 不同,则用 gofmt 的版本覆盖它。
    		如果在覆盖期间发生错误,原始文件将从自动备份中恢复
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    1. -s

    gofmt默认不对代码进行简化,使用-s参数可以开启简化代码功能,具体来说会进行如下的转换:
    gofmt -l -d -w -s [path]

    • 去除数组、切片、Map初始化时不必要的类型声明:
      如下形式的切片表达式:
          []T{T{}, T{}}
      将被简化为:
          []T{{}, {}}
      
      • 1
      • 2
      • 3
      • 4
    • 去除数组切片操作时不必要的索引指定
      如下形式的切片表达式:
          s[a:len(s)]
      将被简化为:
          s[a:]
      
      • 1
      • 2
      • 3
      • 4
    • 去除迭代时非必要的变量赋值
      如下形式的迭代:
          for x, _ = range v {...}
      将被简化为:
          for x = range v {...}
      如下形式的迭代:
          for _ = range v {...}
      将被简化为:
      	for range v {...}
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8

    不过这可能会导致与早期版本的 Go 不兼容的更改。

    2. -r

    可以看到,gofmt命令还支持自定义的重写规则,使用-r参数,按照pattern -> replacement的格式传入规则。

    # 检查文件中是否有不必要的括号:
        gofmt -r '(a) -> a' -l *.go
    
    # 删除括号:
        gofmt -r '(a) -> a' -w *.go
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3. go fmt和gofmt

    gofmt是一个独立的cli程序,而go中还有一个go fmt命令,go fmt命令是gofmt的简单封装。

    usage: go fmt [-n] [-x] [packages]
    
    Fmt runs the command 'gofmt -l -w' on the packages named
    by the import paths. It prints the names of the files that are modified.
    For more about gofmt, see 'go doc cmd/gofmt'.
    For more about specifying packages, see 'go help packages'.
    The -n flag prints commands that would be executed.
    The -x flag prints commands as they are executed.
    To run gofmt with specific options, run gofmt itself.
    
    See also: go fix, go vet.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    go fmt命令本身只有两个可选参数-n-x

    • -n仅打印出内部要执行的go fmt的命令;
    • -x命令既打印出go fmt命令又执行它;

    如果需要更细化的配置,需要直接执行gofmt命令。

    4. goland中配置gofmt

    点击Setting-> Tools -> File Watchers,点加号添加一个go fmt模版,Goland中预置的go fmt模版使用的是go fmt命令,将其替换为gofmt,然后在参数中增加-l -w -s参数,启用代码简化功能。添加配置后,保存源码时,goland就会执行代码格式化了。
    在这里插入图片描述

  • 相关阅读:
    python 程序打包工具--Nuitka
    offset新探索:双管齐下,加速大数据量查询
    基于微信旅游景区景点购票小程序设计与实现 开题报告
    Eclipse项目导入笔记大全&踩坑大全
    Java stream sorted使用 Comparator 进行多字段排序
    论文解读(GSAT)《Interpretable and Generalizable Graph Learning via Stochastic Attention Mechanism》
    Mysql 字符集修改方案及说明
    C++学习笔记(四): 类、头文件、对象
    移动目标轨迹预测方法研究综述
    华为云数据库 RDS for MySQL 的读写分离,凭什么打破企业数据瓶颈?
  • 原文地址:https://blog.csdn.net/weixin_52000204/article/details/126638903