如何在go中获取函数的地址?

Tar*_*ion 0 pointers go cgo

是否可以在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函数不起作用。但是上面的代码似乎离它没有那么远。我只是想知道是否可以以某种方式跳过导出步骤。

I15*_*159 5

function Go中的type不可寻址且不可比,原因是:

函数指针表示函数的代码。由函数文字创建的匿名函数的代码仅在内存中存储一​​次,无论返回匿名函数值的代码运行了多少次。

原始答案

如果需要比较功能的地址,可以使用reflect.Pointer。但是此操作无论如何都比没有意义更无意义,因为:

如果v的Kind为Func,则返回的指针是基础代码指针,但不一定足以唯一地标识单个函数。唯一的保证是,当且仅当v为nil func值时,结果为零。