今天小编给大家分享一下Go语言自定义linter静态检查工具怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。众所周知Go语言是一门编译型语言,编译型语言离不开词法分析、语法分析、语义分析、优化、编译链接几个阶段,学过编译原理的朋友对下面这个图应该很熟悉:编译器将高级语言翻译成机器语言,会先对源代码做词法分析,词法分析是将字符序列转换为Token序列的过程,Token一般分为这几类:关键字、标识符、字面量(包含数字、字符串)、特殊符号(如加号、等号),生成Token序列后,需要进行语法分析,进一步处理后,生成一棵以 表达式为结点的 语法树,这个语法树就是我们常说的AST,在生成语法树的过程就可以检测一些形式上的错误,比如括号缺少,语法分析完成后,就需要进行语义分析,在这里检查编译期所有能检查静态语义,后面的过程就是中间代码生成、目标代码生成与优化、链接,这里就不详细描述了,这里主要是想引出抽象语法树(AST),我们的静态代码检查工具就是通过分析抽象语法树(AST)根据定制的规则来做的;那么抽象语法树长什么样子呢?我们可以使用标准库提供的go/ast、go/parser、go/token包来打印出AST,查看AST,具体AST长什么样我们可以看下文的例子;假设我们现在要在我们团队制定这样一个代码规范,所有函数的第一个参数类型必须是Context,不符合该规范的我们要给出警告;好了,现在规则已经定好了,现在我们就来想办法实现它;先来一个有问题的示例:对应AST如下:通过上面的AST结构我们可以找到函数参数类型具体在哪个结构上,因为我们可以根据这个结构写出解析代码如下:然后执行命令如下:通过输出我们可以看到,函数add()第一个参数必须是Context;这就是一个简单实现,因为AST的结构实在是有点复杂,就不在这里详细介绍每个结构体了,可以看曹大之前写的一篇文章:golang
和 ast看过上面代码的朋友肯定有点抓狂了,有很多实体存在,要开发一个linter,我们需要搞懂好多实体,好在go/analysis进行了封装,go/analysis为linter
提供了统一的接口,它简化了与IDE,metalinters,代码Review等工具的集成。如,任何go/analysislinter都可以高效的被go
vet执行,下面我们通过代码方式来介绍go/analysis的优势;新建一个项目代码结构如下:添加检查模块代码,在firstparamcontext.go添加如下代码:然后添加分析器:命令行执行如下:如果我们想添加更多的规则,使用golang.org/x/tools/go/analysis/multichecker追加即可。我们可以把golang-cli的代码下载到本地,然后在pkg/golinters 下添加免费云主机域名firstparamcontext.go,代码如下:然后重新make一个golang-cli可执行文件,加到我们的项目中就可以了。以上就是“Go语言自定义linter静态检查工具怎么实现”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注百云主机行业资讯频道。
本文小编为大家详细介绍“jquery如何验证input不能为空”,内容详细,步骤清晰,细节处理妥当,希望这篇“jquery如何验证input不能为空”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。 方法:1、利用“input元素对象.…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。