当前位置 博文首页 > golang一些常用的静态检查工具详解

    golang一些常用的静态检查工具详解

    作者:xiaoliizi 时间:2021-02-01 06:10

    一、背景

    俗话说,工欲善其事,必先利其器。go 作为一个对基础功能封装非常好的语言,对编码体验,如何更高效地写出高性能代码,都是考虑非常好的。因此,如何能够写出更美观、更安全的golang代码,也是我们需要关注的目标。go 本身也提供了非常多的工具供我们使用。

    这里先将所有常用的指令放到这个表格中:

    二、gofmt

    主要修复代码格式,比如代码块的tab。

    2.1 参数说明

    -l: 仅打印需要替换的文件名字,不替换文件内容

    如下:

    在这里插入图片描述

    -r: 指定替换规则,格式:-s “pattern -> replacement”

    -s:显式指定需要替换的文件

    -w:直接修改目标文件,且命令行不打印任何数据

    idea 自带,也可以使用下面的语句强行执行

    一般是对工程中变量名字的对齐,比如行开头统一使用tab

    注意:gofmt ≠ 代码规范,比如它不会管单行是否超过了120个字符

    2.2 go fmt

    go fmt 是对 gofmt 的简单封装,比如一些通用的代码规范规则,我们直接使用go fmt 就可以直接覆盖了。效果如下:

    在这里插入图片描述

    当然,和 gofmt 一样,go fmt 也不能解决代码本身的逻辑问题。

    三、goimports(比gofmt 更常用)

    goimports 是gofmt 的升级版,相对gofmt,它不仅可以修复代码格式,还可以规范import 的格式。
    比较规范的import 格式:

    import(
     // 标准包
     "log"
     "json"
     ...
     // 内部包
     "mygoproject/model/..."
     ...
     // 第三方包
     "github.com/..."
    )

    3.1 安装

    go get golang.org/x/tools/cmd/goimports

    3.2 goland 配置

    在这里插入图片描述

    3.3 手动格式化代码/项目

    修改某个文件:
    goimports -w filename

    修改整个目录下的所有代码:
    goimports -w 目录名

    3.4 扩展:为什么格式规范化推荐用 goimports 而不是 go fmt

    总结:goimports 也封装了gofmt 的功能,而且goimports 会对无用import 删除,对go 自己的包和第三方包 进行整理,功能更强大。

    四、go vet (静态代码检查)

    前面看到的 gofmt 和 goimports 都不涉及到代码逻辑的检查。那么接下来就是 go vet 大展手脚的地方了

    4.1 执行

    扫描单个文件:
    go vet filename.go

    扫描整个项目:
    go vet ./…

    4.2 可以修复的问题 4.2.1 语法

    在这里插入图片描述

    比如这里我们使用 go routine 的语法有问题,执行 go vet 会提示:function must be invoked in go statement

    4.2.2 循环 和 goroutine/defer

    还是前面的示例,把括号补充之后,依然会报错:
    loop variable currentFloat captured by func literal

    这就是在循环中使用协程带来的问题了。具体原因可以参考这个问答说明。

    循环中使用 go routine 一定要注意参数的传递方式。正确的使用方式:

    在这里插入图片描述

    4.2.3 其他语法问题

    比如永远是true/false的表达式,或者是不可到达的代码等。

    五、go module

    管理项目依赖
    专题介绍

    六、附录-其他参考文章

    1、goland 自带的go 工具

    js