今天看到别人的代码中,将结构体绑定的方法作为函数指针参数传入了一个函数,感觉这样的写法,有些新奇。
实验了一下,在c++中,这种写法是不可行的
class P {
public:
int a;
void f() {
cout << this->a << endl;
}
};
void test(void(*f)(void)) {
f();
}
int main()
{
P p;
test(p.f); //这里报错:指向绑定函数的指针只能用于调用函数
system("pause");
return EXIT_SUCCESS;
}
但是在go中,确是正确的
package main
import "fmt"
type P struct {
a int
i func()
}
func (p *P) f() {
fmt.Println(p.a)
p.i()
}
func test(f func()) {
f()
}
func generate() func() {
p := P{
a: 3,
i: func() {
fmt.Println("ttt")
},
}
return p.f
}
func main() {
test(generate())
}
结果:
$ go run test.go
3
ttt
具体原因不得而知
推测是由于go有闭包特性,使得p对象的生命周期得到延长,也就可以支持成员函数作为一个普通函数指针