【发布时间】:2014-11-05 02:17:18
【问题描述】:
有没有办法以编程方式确定 Go 中函数的参数(序列及其类型)?
我想将 HTTP 请求动态转换为方法/函数调用,以避免编写重复的编组代码(是的,我知道我需要非常小心我公开的方法以及可能涉及的安全风险)。如果我可以检查函数期望的参数,从请求中解析适当的值然后动态调用函数,这似乎才有可能(看起来最后一步将使用 reflect.Value.Call - 至少那部分看起来很直接前进)。
编辑:能够做到这一点的好处是您可以创建一个适合直接在 Go 中以及远程使用的方法。例如,如果你有一个这样的函数:
func UpdatePerson(p *Person) error { ... }
这显然可以在 Go 中使用;我也希望能够通过 HTTP 向外部公开它。
使用 json-rpc 很接近,但看起来它(在某些情况下)需要一些更复杂的结构来用于其上的 i/o。
编辑 2:基本上我有一大堆 CRUD 要编写,我只想公开 DAO 的一部分,而不必编写所有这些疯狂的编组代码来创建另一个处理 HTTP 内容的层。 (对于一些安全敏感的东西,我需要更仔细地编写东西,但我的许多 DAO 函数实际上应该可以“直接从浏览器”调用 - 也可以从 Go 调用。) json-rpc 满足第一个要求,但不必然是第二个。
【问题讨论】:
-
不——该函数需要在某个地方引用,否则它可能会在构建过程中被删除。为此,我认为没有办法仅通过查询运行时来动态发现(可能丢弃的)函数。但是,有
runtime.FuncForPC.. 但这是静态检查的,需要您将函数传递给它。还有一些方法可以通过堆栈跟踪提取函数的详细信息。但同样,如果您计划使用动态分辨率,这对您没有太大帮助。 -
明白了。如果我有对 func 本身的引用(因此它不会在链接阶段丢失)但没有调用它,例如: var MyFuncs = map[string]interface{} { "func1": func1 } Is there有什么反映让我在运行时更详细地看一下?
-
我不知道......不。
reflect包处理类型 .. 不是包。不过,您也许可以调查reflect.MakeFunc以动态调度您的电话(我自己没有使用过它......不过看起来很有希望)。
标签: function reflection go