在Go语言中可以获取函数引用的地址吗?
就像
func myFunction() {
}
// ...
unsafe.Pointer(&myFunction)
但事实并非如此。我猜这是不可能的,但我还没有找到任何证据。
编辑:背景
我的问题的背景来自于处理CGO和C函数指针。这个方法的作用是:
/*
void go_myFunction();
typedef void (*myFunction_f)();
myFunction_f pMyFunction;
*/
import "C"
//export go_myFunction
func go_myFunction() {
// ...
}
func SetupFp() {
C.pMyFunction = (*[0]byte)(unsafe.Pointer(C.go_myFunction))
}
我也知道文档中指出传递一个指向go函数的指针是不起作用的。但是上面的代码似乎离它不远了。我只是想知道是否有人可以以某种方式跳过出口步骤。
4条答案
按热度按时间bihw5rsg1#
Go语言中的
function
类型是不可寻址的,也是不可比较的,因为:函数指针表示函数的代码。而且由function literal创建的匿名函数的代码在内存中只存储一次,不管返回匿名函数值的代码运行了多少次。
Original answer
如果你需要比较一个函数的地址,你可以用
reflect.Pointer
来做。但无论如何,这种操作比不可能更无意义,因为:如果v的Kind是Func,则返回的指针是底层代码指针,但不一定足以唯一地标识单个函数。唯一的保证是当且仅当v是nil func Value时结果为零。
zfciruhq2#
你可以像这样得到一个Go函数的地址:
nwsw7zdq3#
可以使用函数GetFuncAddr获取函数地址:
lsmepo6l4#
你可以这样做: