如何动态 reflect.New 参数并调用函数?

how to dynamic reflect.New params and call the func?

我想在接收 http 调用时使用普通函数而不是 HttpHandler 所以我应该动态新参数来调用函数。

package main

import (
    "fmt"
    "reflect"
)

func main() {
    invoke(test)
}

func invoke(function interface{}) {
    funcType := reflect.TypeOf(function)
    if funcType.Kind() == reflect.Func {
        paramType := funcType.In(0).Elem()
        input := reflect.New(paramType)
        input.Elem().Field(0).SetString("neason")
        input.Elem().Field(1).SetInt(18)

        fmt.Println(input)

        funcValue := reflect.ValueOf(function)

        params := []reflect.Value{
            reflect.ValueOf(input),
        }

        funcValue.Call(params)
    }
}

type Input struct {
    Name string
    Age  int
}

type Output struct {
    Name string
    Age  int
}

func test(input *Input) Output {
    return Output{
        Name: input.Name,
        Age:  input.Age,
    }
}

它会 panic: reflect: Call using *reflect.Value as type *main.Input 如何动态 reflect.New 参数并调用函数?

你有一层额外的 reflect.Value 包装器。直接使用input作为参数。已经是 reflect.Value.

    params := []reflect.Value{input}

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