首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在go中获取函数的地址?

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

Stack Overflow用户
提问于 2016-12-08 15:49:54
回答 3查看 5.4K关注 0票数 0

是否有可能在Go中获得函数引用的地址?

有点像

代码语言:javascript
复制
func myFunction() {
}

// ...

unsafe.Pointer(&myFunction)

只是那不是这样的。我想这是不可能的,但我还没有找到任何证据。

编辑:背景

我问题的背景来自于处理CGO和C函数指针。这样做是可行的:

代码语言:javascript
复制
/*
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函数的指针不起作用。但是上面的代码似乎没有那么远。我只是想知道是否可以跳过出口这一步。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-12-08 17:36:12

Go中的function类型不是可寻址的,也不是可比的,因为:

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

Original answer

如果需要比较函数的地址,可以使用reflect.Pointer进行比较。但无论如何,这个手术都是毫无意义的,而不是不可能的,因为:

如果v的类型是Func,则返回的指针是底层代码指针,但不一定足以唯一地标识单个函数。唯一的保证是结果为零当且仅当v是一个零函数值。

票数 9
EN

Stack Overflow用户

发布于 2017-08-30 17:57:55

您可以得到这样的Go函数的地址:

代码语言:javascript
复制
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)
}
票数 3
EN

Stack Overflow用户

发布于 2021-02-26 18:17:41

您可以获得函数的地址,使用函数GetFuncAddr

代码语言:javascript
复制
    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 )
  }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41043462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档