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()
}