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

标签 go function-pointers unsafe-pointers

在 C 中,您可以将函数指针放入 void 指针数组中,然后将它们转换回任何类型的函数指针:

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 函数指针?

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

最佳答案

正如 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))
}

playground

关于Go:将 unsafe.Pointer 转换为函数指针,反之亦然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22933169/

相关文章:

javascript - 在golang中获取Ace.js编辑器的值

date - 如何使用 go time 解析外语日期字符串

c++实现定时回调函数

c - 在双链表上查找带有 void * 的函数

c++ - 带有可变参数模板的成员函数指针

swift - UnsafePointer<Int8> 不工作

go - 当多个客户端使用它时,Gorilla Websocket非常慢

docker - Go测试失败时停止docker容器服务

c# - 为什么在这种情况下为 for 循环使用指针性能更高?

go - 将类型 T 的 slice 转换为 Go 中的字节 slice 的快速方法