我是键入安全的新手,不知道如何进行以下操作
package main
func test(){
print("In Test")
}
func main(){
a := "test"
a()
}
我是键入安全的新手,不知道如何进行以下操作
package main
func test(){
print("In Test")
}
func main(){
a := "test"
a()
}
如果你陈述你想要达到的目标,你可能会得到更好的答案,因为反思通常不是最好的方法。但如果函数是类型上的方法,则反射会有所帮助( net/rpc就是一个例子)。
package main
import (
"fmt"
"reflect"
)
type T struct {}
func (T) Add(x, y int) int {
return x + y
}
func main() {
t := reflect.ValueOf(T{})
m := t.MethodByName("Add")
args := []reflect.Value{reflect.ValueOf(1), reflect.ValueOf(2)}
fmt.Println(m.Call(args)[0].Int())
}
如果您想知道godoc 之类的工具是如何工作的,它们会解析源代码而不是使用反射。
编辑:游乐场版本
无法从字符串解析函数。但是,您可以将函数分配给变量。
a := test
a()
您还可以将函数(假设它们都具有相同的签名)放入映射中:
var func_map := map[string]func() {
"test": test,
}
a := func_map["test"]
a()
对 OP 的第一条评论的回应(太长,无法发表另一条评论):
他们并不都有相同的签名
如果他们没有相同的签名,你打算怎么称呼他们?您可以使用该reflect
软件包,但这通常表明您做错了什么。
这不是一种动态语言,有些事情在 Go 中无法完成。虽然,无论如何,它们大多是你不应该在大多数语言中做的事情。
没有办法通过名称动态查找函数,但我认为值得一提的原因。基本上,原因是编译器和/或链接器可以消除未使用的函数。
考虑一下,如果您能够通过名称获取函数,那么每个导入包中的每个函数(递归)都必须链接到最终的可执行文件中,即使它从未使用过,以防万一有人想通过以下方式查找它姓名。人们已经抱怨 Go 二进制文件的体积很大,但这会使它们变得更大。