是否有可能在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函数的指针不起作用。但是上面的代码似乎没有那么远。我只是想知道是否可以跳过出口这一步。
发布于 2016-12-08 17:36:12
Go中的function类型不是可寻址的,也不是可比的,因为:
函数指针表示函数的代码。函数文字创建的匿名函数的代码只存储在内存中一次,不管返回匿名函数值的代码运行了多少次。
如果需要比较函数的地址,可以使用reflect.Pointer进行比较。但无论如何,这个手术都是毫无意义的,而不是不可能的,因为:
如果v的类型是Func,则返回的指针是底层代码指针,但不一定足以唯一地标识单个函数。唯一的保证是结果为零当且仅当v是一个零函数值。
发布于 2017-08-30 17:57:55
您可以得到这样的Go函数的地址:
package main
import (
"fmt"
"reflect"
)
func HelloWorld() {
fmt.Println("Hello, world!")
}
func main() {
var ptr uintptr = reflect.ValueOf(HelloWorld).Pointer()
fmt.Printf("0x%x", ptr)
}发布于 2021-02-26 18:17:41
您可以获得函数的地址,使用函数GetFuncAddr
package main
import (
"fmt"
"unsafe"
"reflect"
)
func HelloWorld() {
fmt.Println("Hello, world!")
}
func GetFuncAddr(i interface{}) uintptr {
type IHeader struct {
typ uintptr
word uintptr
}
return (*IHeader)(unsafe.Pointer(&i)).word
}
func main() {
tmp := HelloWorld
ptr1 := *(*uintptr)(unsafe.Pointer(&tmp)) //Way 1
ptr2 := GetFuncAddr(HelloWorld) //Way 2
fmt.Printf("0x%x = 0x%x", ptr1, ptr2)
//Thits is not are functon addrress!!!
BadPTR1 := reflect.ValueOf(HelloWorld).Pointer()
BadPTR2 := **(**uintptr)(unsafe.Pointer(&tmp)) //dereferenced pointer
fmt.Printf("\nBAD: 0x%x = 0x%x", BadPTR1 , BadPTR2 )
}https://stackoverflow.com/questions/41043462
复制相似问题