gpt4 book ai didi

reflection - 使用反射检查分配给 interface{} 变量的函数签名

转载 作者:IT王子 更新时间:2023-10-29 01:55:49 24 4
gpt4 key购买 nike

我正在尝试构建 函数看起来像:

package curry

import (
"fmt"
"reflect"
)

// Function
type fn interface{}

// Function parameter
type pr interface{}

// It return the curried function
func It(f fn, p ...pr) (fn, error) {
// examine the concret type of the function f
if reflect.ValueOf(f).Kind() == reflect.Func {
// Get the slice of input and output parameters type
} else {
return nil, fmt.Errorf("%s", "takes a function as a first parameter")
}
// _, _ = f, p
return nil, nil
}

是否可以将输入和输出参数类型的 slice 提取为函数 f[]reflect.Type

最佳答案

你可以使用reflect.Type.In(int)reflect.Type.Out(int),有相应的方法叫做NumIn() int NumOut() int 为您提供输入/输出的数量。

但是,请记住一些注意事项:

  1. 要正确提取任意签名的函数,您需要无数个案例。您必须依次切换每个 In 和 Out 才能正确获取要提取的类型。
  2. 无论如何你都不能动态地创建一个函数。没有与 SliceOf、MapOf 等一起使用的 FuncOf 方法。无论如何,您都必须手动编写柯里化(Currying)版本的代码。
  3. 使用反射来模拟泛型通常被认为是一个 Bad Idea™。

如果你绝对必须做这样的事情,我强烈建议制作一个接口(interface)并让每个实现自己进行柯里化(Currying),而不是试图在所有情况下“通用地”破解它,这在 Go 中永远不会起作用1.2.1.

关于reflection - 使用反射检查分配给 interface{} 变量的函数签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22309203/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com