登录
首页 >  Golang >  Go问答

如何在编译时确定哪些函数被 go 模块调用?

来源:stackoverflow

时间:2024-03-26 10:21:33 261浏览 收藏

在编写 Go AWS Lambda 函数时,如何确定模块调用了哪些函数,这是一个常见问题。虽然手动识别调用可以解决问题,但本文探讨了更有效的方法。文章提供了多种变体来尝试,包括使用“go mod why”和“grep”命令。然而,这些方法存在局限性,例如仅识别单个调用或不考虑二阶依赖。本文建议使用 AST 解析或 pprof 等工具来检测二进制文件,以更全面地确定模块调用的函数。

问题内容

我正在使用 go 编写一些 aws lambda 函数。常见功能分为多个模块,例如,我有一个模块 (m1),它提供了 dynamodb 方面的后备存储接口的实现(因此依赖于 aws go sdk)。

在一个 lambda 函数 (f1) 中,我导入 m1,因此代码路径的依赖关系图如下所示:

f1 -> m1 -> sdk -> dynamodb.dynamodb.putitem

作为 aws,我需要编写相应的 iam 策略以允许 f1 执行 putitem

目前,我手动识别 aws sdk 调用并修复 cloudwatch 中记录的任何错误。

我的目标是确定是否有办法让 go 工具链识别从给定模块/导入调用哪些函数。

到目前为止,我可以尝试以下几种变体:

# this doesn't return much as most of my code lives within directories
# under main
go mod why "github.com/aws/aws-sdk-go"
# github.com/aws/aws-sdk-go
(main module does not need package github.com/aws/aws-sdk-go)

# this only identifies a single F1 {-> ...} -> SDK invocation
# but not all of them
grep -r github.com/aws/aws-sdk-go --include="*.go" \
  | cut -f2 -d'"' \
  | sort -u \
  | xargs go mod why

我还没有深入研究 go buildgo mod why 的源代码,但到目前为止我还没有找到一种方法来说服“go mod why”来理解简单的 glob 扩展/正则表达式和相应的调用点。我在二阶依赖(即 m1->sdk)方面也没有取得任何进展。


解决方案


go mod graph 将为您提供依赖关系图,但这不会告诉您正在调用哪些函数;这不属于依赖管理的范围,依赖管理在模块级别运行。要查看正在调用哪些函数,您需要通过 AST 解析源代码,或者使用例如以下命令来检测二进制文件: pprof

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>