是否可以在Go中获取函数引用的地址?
就像是
func myFunction() {
}
// ...
unsafe.Pointer(&myFunction)
Run Code Online (Sandbox Code Playgroud)
只是那是行不通的。我的猜测是不可能的,但是我还没有找到任何证据。
编辑:背景
我的问题的背景来自于处理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))
}
Run Code Online (Sandbox Code Playgroud)
我也知道文档说明将指针传递给go函数不起作用。但是上面的代码似乎离它没有那么远。我只是想知道是否可以以某种方式跳过导出步骤。
function Go中的type不可寻址且不可比,原因是:
函数指针表示函数的代码。由函数文字创建的匿名函数的代码仅在内存中存储一次,无论返回匿名函数值的代码运行了多少次。
如果需要比较功能的地址,可以使用reflect.Pointer。但是此操作无论如何都比没有意义更无意义,因为:
如果v的Kind为Func,则返回的指针是基础代码指针,但不一定足以唯一地标识单个函数。唯一的保证是,当且仅当v为nil func值时,结果为零。