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

问题描述 投票:3回答:2

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

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

go function-pointers unsafe-pointers
2个回答
3
投票

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

游戏场


2
投票

似乎可以用。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.