今天看到别人的代码中,将结构体绑定的方法作为函数指针参数传入了一个函数,感觉这样的写法,有些新奇。

实验了一下,在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对象的生命周期得到延长,也就可以支持成员函数作为一个普通函数指针