Используют пакет golang.org/x/tools/go/analysis: определяют Analyzer с Run-функцией, обходят AST (пакет go/ast), сообщают о проблемах через pass.Reportf. Анализатор можно подключать к go vet -vettool, multichecker или golangci-lint (как custom plugin). Документация: golang.org/x/tools.
var myAnalyzer = &analysis.Analyzer{
Name: "myanalyzer",
Run: run,
}
func run(pass *analysis.Pass) (interface{}, error) {
ast.Inspect(pass.Files[0], func(n ast.Node) bool {
// report if needed
return true
})
return nil, nil
}