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

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

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


芜湖不芜
浏览 277回答 2
2回答

慕田峪7331174

正如 LinearZoetrope 的回答所示,您可以这样做。当心你可以做坏事:package mainimport (&nbsp; &nbsp; "fmt"&nbsp; &nbsp; "unsafe")func main() {&nbsp; &nbsp; f1 := func(s string) {}&nbsp; &nbsp; f2 := func(i int) int { return i + 1 }&nbsp; &nbsp; pointers := []unsafe.Pointer{&nbsp; &nbsp; &nbsp; &nbsp; unsafe.Pointer(&f1),&nbsp; &nbsp; &nbsp; &nbsp; unsafe.Pointer(&f2),&nbsp; &nbsp; }&nbsp; &nbsp; f3 := (*func(int) bool)(pointers[1]) // note, not int&nbsp; &nbsp; fmt.Println((*f3)(1))}

跃然一笑

它似乎有效:package mainimport (&nbsp; &nbsp; "fmt"&nbsp; &nbsp; "unsafe"&nbsp; &nbsp; "math")func main() {&nbsp; &nbsp; fn := print&nbsp; &nbsp; faked := *(*func(float64))(unsafe.Pointer(&fn))&nbsp; &nbsp; faked(1.0)&nbsp; &nbsp; // For comparison&nbsp; &nbsp; num := math.Float64bits(1.0)&nbsp; &nbsp; print(num)}func print(a uint64) {&nbsp; &nbsp; fmt.Println(a)}会打印46071824188000174084607182418800017408当然,您可能很清楚尝试这样做的潜在问题。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go