当前位置: 首页 > 面试题库 >

GoLang上的反射错误-参数太少

贺功
2023-03-14
问题内容

我有这个控制器:

package web

import (
    "net/http"
)

func init() {

}

func (controller *Controller) Index(r *http.Request) (string, int) {
    return "Testing", http.StatusOK
}

使用此处理程序:

type Application struct {
}

func (application *Application) Route(controller interface{}, route string) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {

        var ptr reflect.Value
        var value reflect.Value
        var finalMethod reflect.Value

        value = reflect.ValueOf(controller)

        // if we start with a pointer, we need to get value pointed to
        // if we start with a value, we need to get a pointer to that value
        if value.Type().Kind() == reflect.Ptr {
            ptr = value
            value = ptr.Elem()
        } else {
            ptr = reflect.New(reflect.TypeOf(controller))
            temp := ptr.Elem()
            temp.Set(value)
        }

        // check for method on value
        method := value.MethodByName(route)
        if method.IsValid() {
            finalMethod = method
        }
        // check for method on pointer
        method = ptr.MethodByName(route)
        if method.IsValid() {
            finalMethod = method
        }

        methodInterface := finalMethod.Call([]reflect.Value{})[0].Interface()
        method_route := methodInterface.(func(r *http.Request) (string, int))
        body, code := method_route(r)
        switch code {
        case http.StatusOK:
            io.WriteString(w, body)
        case http.StatusSeeOther, http.StatusFound:
            http.Redirect(w, r, body, code)
        default:
            w.WriteHeader(code)
            io.WriteString(w, body)
        }
    }
}

并以这种方式执行:

controller := &web.Controller{}
application := &system.Application{}

http.HandleFunc("/", application.Route(controller, "Index"))

问题是编译好了。它没有显示任何错误,但是当我转到网站时,仅指向localhost,它显示:

2014/12/27 22:38:16 http: panic serving 127.0.0.1:58304: reflect: Call with too few input arguments
goroutine 20 [running]:
net/http.func·011()
    /usr/local/Cellar/go/1.3.3/libexec/src/pkg/net/http/server.go:1100 +0xb7

我找不到任何错误,而且编译还可以,这很奇怪…我是Go语言的新手,所以我不知道发生了什么…


问题答案:

我通过阅读以下内容找到了答案:

http://codingdict.com/questions/63176

因此,与其尝试调用该方法,不如:

    methodInterface := finalMethod.Call([]reflect.Value{})[0].Interface()
    method_route := methodInterface.(func(r *http.Request) (string, int))
    body, code := method_route(r)

我只是获得所需的接口,然后将其转换为函数并如此调用它。

    methodInterface := finalMethod.Interface()
    method_route := methodInterface.(func(r *http.Request) (string, int))
    body, code := method_route(r)

实际上,这就是我已经在做的事情,但是方式错误。



 类似资料:
  • 问题内容: 我正在使用reflect.MakeFunc编写函数。该函数可以返回错误。成功时,我希望它为错误类型的返回值返回nil。我该如何使用反射?目前我有这个: 我懂了。我也尝试添加一个之后,但我得到了。我尝试了,但出现了细分错误。 如何获得代表nil错误的reflect.Value? 问题答案: 使用以下内容: 让我们分解一下。第一步是为: 。更简单的方法不起作用,因为参数的具体值为。没有类型

  • 问题内容: 我试图递归地反映一个结构,打印出每个字段的类型。在字段是结构片段的情况下,我希望能够识别数组中保存的类型,然后在该类型上进行反映。 这是一些示例代码 输出看起来像这样: 当我确定字段类型是指针的一部分时,我可以通过调用subtype.Elem()来推断类型。 输出为“ main.child” 如果我然后尝试反映孩子使用 我得到以下内容: 如何使用反射API遍历子结构的字段? 问题答案:

  • 我是PHP和Laravel的初学者。我在我的项目Laravel 7中使用。我有存储库模式在我的项目与缓存。 PageServiceProvider: CachingBaseRepository: BaseRepository: PageRepository: 恶作剧记录片 PageRepositoryInterface: 我想在上面的代码中为我的网站添加缓存。我的控制器如下所示: 当我运行上述代码

  • 问题内容: 我有一个Class对象,我想调用一个静态方法。我有以下代码。 打印: 但是随后它抛出: 我在这里俯瞰什么? 问题答案: 您将不得不使用 该方法接受。 (更正)传递的数组按原样使用并且为空,因此它没有要传递给方法调用的元素。通过将其强制转换为对象,这就是包装中的唯一元素。 这是由于数组协方差。你可以做 因为a 是。 另外,您也可以将其包装在 然后,该方法将使用as中的元素作为方法调用的参

  • 我不懂编码。我的第一个语言是Clojure。这是我关于stackoverflow的第一个问题。 我编写了一个Clj代码,在lein(Emacs/Cider)上测试了所有函数,我想编译以进行测试。但是Java方法返回了以下错误消息: (在项目文件夹中的终端上): (和getHeight、getRGB、setRGB、java.io.File、javax.imeageio.ImageIO、java.la

  • 主要内容:1 Java8 方法参数反射的介绍,2 Method类,3 Method类的方法,4 Parameter类,5 Parameter类的方法,6 Java8 方法参数反射的案例1 Java8 方法参数反射的介绍 Java提供了一项新功能,您可以在其中获得任何方法或构造函数的形式参数的名称。java.lang.reflect包包含所有必需的类,例如Method和Parameter,可用于参数反射。 2 Method类 Method类提供有关类或接口上的单个方法的信息。反射的方法可以是类方法