为了账号安全,请及时绑定邮箱和手机立即绑定

Go:将 unsafe.Pointer 转换为函数指针,反之亦然

Go:将 unsafe.Pointer 转换为函数指针,反之亦然

Go
芜湖不芜 2021-07-28 18:51:40
在 C 中,您可以将函数指针放入空指针数组中,然后将它们转换回任何类型的函数指针:extern int (*fn1)(void);extern void (*fn2)(int);void foo(void){        void *array[2];        int i;        /* implicit cast from function pointer to void pointer */        array[0] = fn1;        array[1] = fn2;        for (i = 0; i < 2; i++)        {                int (*fp)(int, int, int);                /* implicit cast from void pointer to function pointer */                fp = array[i];                /* call function with a different signature */                fp(1, 2, 3);        }}我需要在 Go 中做同样的事情,使用 unsafe.Pointers。问题是:Go 函数指针可以转换为 unsafe.Pointer 吗?unsafe.Pointer 可以转换为与原始函数指针不同(或相同)类型的 Go 函数指针吗?(问题不是我为什么或是否需要这样做;在给定的情况下,可以使用错误的参数集调用函数并误解返回值,因为调用者和被调用者能够处理这种情况。 )
查看完整描述

2 回答

?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

正如 LinearZoetrope 的回答所示,您可以这样做。当心你可以做坏事:


package main


import (

    "fmt"

    "unsafe"

)


func main() {

    f1 := func(s string) {}

    f2 := func(i int) int { return i + 1 }

    pointers := []unsafe.Pointer{

        unsafe.Pointer(&f1),

        unsafe.Pointer(&f2),

    }

    f3 := (*func(int) bool)(pointers[1]) // note, not int

    fmt.Println((*f3)(1))

}


查看完整回答
反对 回复 2021-08-02
?
跃然一笑

TA贡献1826条经验 获得超6个赞

它似乎有效:


package main


import (

    "fmt"

    "unsafe"


    "math"

)


func main() {

    fn := print

    faked := *(*func(float64))(unsafe.Pointer(&fn))

    faked(1.0)


    // For comparison

    num := math.Float64bits(1.0)

    print(num)

}


func print(a uint64) {

    fmt.Println(a)

}

会打印


4607182418800017408


4607182418800017408


当然,您可能很清楚尝试这样做的潜在问题。


查看完整回答
反对 回复 2021-08-02
  • 2 回答
  • 0 关注
  • 275 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信