代码之家  ›  专栏  ›  技术社区  ›  Charlie Skilbeck

声明指向签名未知的函数的指针

go
  •  1
  • Charlie Skilbeck  · 技术社区  · 6 月前

    我想声明一个变量,它是一个指向具有未知签名的函数的指针。

    例如,声明一个变量,该变量可以包含指向可以设置为日志的函数的指针。如果我可以去:

    var foo func(format string, v ...any)
    

    ...

    foo = log.Printf
    

    但这假设函数签名是已知的——在C++中,我会使用 decltype 但我在围棋中找不到类似的东西。我试着反思,但没能奏效。

    有人有什么想法吗?

    1 回复  |  直到 6 月前
        1
  •  1
  •   Peter saif iqbal    6 月前

    将反射与界面结合使用,这样您就可以使用界面中的任何功能。我做了一些改变,并在操场上进行了测试

    package main
    
    import (
        "log"
        "reflect"
    )
    
    func main() {
        var foo any = log.Printf
        dynamicFunction(foo, "Pointer, %s!", "Test")
    }
    
    func dynamicFunction(fn any, args ...any) {
        v := reflect.ValueOf(fn)
        in := make([]reflect.Value, len(args))
    
        for i, arg := range args {
            in[i] = reflect.ValueOf(arg)
        }
    
        v.Call(in)
    }
    

    https://go.dev/play/p/fdDwDc46jbn