首先,来看看这段 PHP 代码:

它会输出:


用这个方法调用匹配名字的函数,非常有效。


那么,在 Golang 中是否可能用函数的名字来调用某个函数呢?


作为一个静态、编译型语言,答案是否定的……又是肯定的!


在 Golang 中,你不能这样做:


但这里有一个限制:这个 map 仅仅可以用原型是“func()”的没有输入参数或返回值的函数。

如果想要用这个方法实现调用不同函数原型的函数,需要用到 interface{}。

这样,就可以添加有着不同函数原型的函数到一个 map 中:


那么如何调用 map 中的函数呢?像这样吗:


funcs["foo"]()

绝对不行!这无法工作!你不能直接调用存储在空接口中的函数。


反射走进我们的生活!在 Golang 中有着叫做“reflect”的包。


将函数的值从空接口中反射出来,然后使用 reflect.Call 来传递参数并调用它。

没有什么是很难理解的。


[1]http://www.du52.com/text.php?id=92