首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Go:将unsafe.Pointer转换为函数指针,反之亦然

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

Stack Overflow用户
提问于 2014-04-08 09:39:15
回答 2查看 3.8K关注 0票数 3

在C中,您可以将函数指针放入一个空指针数组中,并将它们转换回任意类型的函数指针:

代码语言:javascript
复制
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函数指针吗?

(问题不是为什么,也不是我是否需要这样做;在给定的情况下,调用一个带有错误参数集的函数并错误解释返回值是可以的,因为调用者和被调用者能够处理这个问题。)

EN

回答 2

Stack Overflow用户

发布于 2014-04-08 09:59:54

正如LinearZoetrope的回答所示,你可以做到这一点。当心你可能会做坏事:

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

游乐场

票数 3
EN

Stack Overflow用户

发布于 2014-04-08 09:55:56

它似乎是有效的:

代码语言:javascript
复制
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

当然,您可能很清楚尝试这种方法可能存在的问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22933169

复制
相关文章

相似问题

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