在 Golang 中用名字调用函数

mikespook ·
不用map还有个方法就是用反射MethodByName再call,但是得func是对象的func,
#4
更多评论
首先感谢下作者,这里提供的想法对我非常有用。 > 但这里有一个限制:这个 map 仅仅可以用原型是“func()”的没有输入参数或返回值的函数。 关于这点,其实是有解决方法的 ``` type NewCipherModel func(b cipher.Block, iv []byte) cipher.BlockMode type ModeFunc string const ( CBCDecrypter ModeFunc = "NewCBCDecrypter" CBCEncrypter ModeFunc = "NewCBCEncrypter" ) funcs := map[ModeFunc] NewCipherModel { CBCEncrypter:cipher.NewCBCEncrypter, CBCDecrypter:cipher.NewCBCDecrypter, } ``` 直接将需要放入map中类型的type一个类型,当然也可以不用别名 ------ 嗯。。。当然这只可以运用在相同原型的函数。 还有一种方式,我是在看了下面反射的过程中想到的。。。事实上我现在还没学反射。所以我相当的方式其实和上面我想到的方式是相似的。因为没有用代码实现,所以不给出代码了。额额额,哇哈哈,发现不用代码说不来。。。其实终结下就是运用类型检查 ``` import "fmt" func main() { funcs := map[string] interface{}{ "fun1":fun1, "fun2":fun2, } switch fun := funcs["fun2"].(type) { case func():fun() case func(i int):fun(1) } } func fun1(){ fmt.Println("fun1") } func fun2(i int) { fmt.Println("fun2") } 输出是: $ go run test.go fun2 ```
#1
不用map 可以做到吗,我要根据文件名调用某目录下的函数,文件数量未知,所以你这 map 有局限性,相当于写死了,有米有更动态的做法
#2