在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进行同样的操作。问题如下:
(问题不是为什么,也不是我是否需要这样做;在给定的情况下,调用一个带有错误参数集的函数并错误解释返回值是可以的,因为调用者和被调用者能够处理这个问题。)
发布于 2014-04-08 09:59:54
正如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))
}游乐场
发布于 2014-04-08 09:55:56
它似乎是有效的:
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
当然,您可能很清楚尝试这种方法可能存在的问题。
https://stackoverflow.com/questions/22933169
复制相似问题