上个星期,我写了篇《Function call by name in Golang》。由于是英文的,所以被人诟病(说谁,谁知道!)。好吧,现在用中文重新写一遍。
Golang 中的函数跟 C 的一样,是个代码块,不过它可以像其他类型那样赋值给一个变量。
如果你对函数不熟悉,《Codewalk: First-Class Functions in Go》应该是个不错的起点。已经有所了解?那么继续吧!
functionfoobar() {
echo"Hello Golang\n";
}
$funcs=array(
"foobar"=>"foobar",
"hello"=>"foobar",
);
$funcs["foobar"]();
$funcs["hello"]();
|
它会输出:
那么,在 Golang 中是否可能用函数的名字来调用某个函数呢?
作为一个静态、编译型语言,答案是否定的……又是肯定的!
在 Golang 中,你不能这样做:
不过可以:
但这里有一个限制:这个 map 仅仅可以用原型是“func()”的没有输入参数或返回值的函数。
如果想要用这个方法实现调用不同函数原型的函数,需要用到 interface{}。
是啊!interface{},跟 C 中的 void 指针类似。还记得这个东西吗?不记得了?没事,看看这个吧:《The Go Programming Language Specification:Interface types》。
反射走进我们的生活!在 Golang 中有着叫做“reflect”的包。你是否了解反射了呢?
如果还没有,那么阅读一下这个:《Laws of reflection》吧。哦,这里有个中文版本:《反射的规则》。
将函数的值从空接口中反射出来,然后使用 reflect.Call 来传递参数并调用它。
没有什么是很难理解的。
我已经完成了一个包来实现这个功能,在这里:https://bitbucket.org/mikespook/golib/src/27c65cdf8a77/funcmap.
希望这有些帮助。好运,地鼠们!