Go 查找特定类型的所有函数
有没有办法列出所有使用/返回特定类型的函数 例如:我对使用以下函数感兴趣Go 查找特定类型的所有函数,go,Go,有没有办法列出所有使用/返回特定类型的函数 例如:我对使用以下函数感兴趣 func ListenAndServe(addr string, handler Handler) error 我怎样才能找到所有可以返回处理程序的函数(跨越所有Go包)?我将使用x/tools/Go/analysis框架编写一个分析工具。这是一个可以在任何模块上运行的草图(它在下面使用go/packages,因此完全支持模块): 一个相关且同样有用的问题是找到满足处理程序接口的所有类型。谢谢,我已经看过了,但与我正
func ListenAndServe(addr string, handler Handler) error
我怎样才能找到所有可以返回处理程序的函数(跨越所有Go包)?我将使用
x/tools/Go/analysis
框架编写一个分析工具。这是一个可以在任何模块上运行的草图(它在下面使用go/packages
,因此完全支持模块):
一个相关且同样有用的问题是找到满足处理程序接口的所有类型。谢谢,我已经看过了,但与我正在寻找的并不完全一致,但如果它对处理程序接口有效,可能也会为我的问题提供提示。gopls和go guru(前oracle)。谢谢@Volker。我之前看过Guru,我能找到的最接近的答案是将类型查询作为“Implement”。然而,Guru会浏览源代码,而不是所有模块。例如,
func CheckTime(t time.time)
我试图找出返回time.time
import (
"bytes"
"fmt"
"go/ast"
"go/format"
"go/token"
"golang.org/x/tools/go/analysis"
"golang.org/x/tools/go/analysis/singlechecker"
)
var RtAnalysis = &analysis.Analyzer{
Name: "rtanalysis",
Doc: "finds functions by return type",
Run: run,
}
func main() {
singlechecker.Main(RtAnalysis)
}
func run(pass *analysis.Pass) (interface{}, error) {
for _, file := range pass.Files {
ast.Inspect(file, func(n ast.Node) bool {
if funcTy, ok := n.(*ast.FuncType); ok {
if funcTy.Results != nil {
for _, fl := range funcTy.Results.List {
if tv, ok := pass.TypesInfo.Types[fl.Type]; ok {
if tv.Type.String() == "net/http.Handler" {
ns := nodeString(funcTy, pass.Fset)
fmt.Printf("%s has return of type net/http.Handler\n", ns)
}
}
}
}
}
return true
})
}
return nil, nil
}
// nodeString formats a syntax tree in the style of gofmt.
func nodeString(n ast.Node, fset *token.FileSet) string {
var buf bytes.Buffer
format.Node(&buf, fset, n)
return buf.String()
}