微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Golang RedirectHandler返回接口,以* http.redirectHandler

如何解决Golang RedirectHandler返回接口,以* http.redirectHandler

请不要对我的帖子太激进,我正在尝试学习Go,但是在我的理解上面临一些挑战。

这是我的示例代码

package main

import (
        "log"
        "net/http"
        "reflect"
        "fmt"
)

func main() {
        mux := http.NewServeMux()

        rh := http.RedirectHandler("http://example.org",307)
        fmt.Println("The type of the object,returned by the RedirectHandler is")
        fmt.Println(reflect.TypeOf(rh))
        fmt.Println("End with type observation")
        mux.Handle("/foo",rh)

        log.Println("Listening ...")
        http.ListenAndServe(":3000",mux)
}

我的问题是:

  1. RedirectHandler返回一个Handler接口,这是一个常见的模式吗?有什么好处?
  2. 这是否意味着您应该在函数内部包含一个实现该接口的结构,然后返回该结构?如果不是,那么实际上我们该如何返回一个接口,因为它实际上只是一组未实现的方法
  3. 如果运行我的代码,您会看到变量'rh'的类型是* http.redirectHandler。对于这样的指针,我无法在Http包中找到任何内容,因此我们从“返回接口”开始,直到“这里是您的指针,文档中不存在”。
  4. 这些只是我令人困惑的想法,我想感谢那些想帮助我解决我的困惑的人。

解决方法

  1. RedirectHandler返回一个Handler接口,这是一个常见的模式吗?有什么好处?

虽然有一条经验法则可以返回具体类型而不是接口(通常称为“接受接口返回结构”),但出于多种原因,有时还是希望隐藏实现。其中之一是可以在软件包的将来版本中自由地以任何方式更改实现。另一个是防止滥用返回值;例如,同时访问struct字段。

使所有这些函数(RedirectHandler,NotFoundHandler,TimeoutHandler等)返回http.Handler也使它们在文档中易于发现:它们全部作为http.Handler的构造函数出现,而不是分散在函数列表中。我假设(!)在决定采用这种方式时可能起了一定作用,但是您必须要问作者(您可以在the mailing list上这样做)。

  1. 这是否意味着[RedirectHandler返回]实现该接口的结构?

也许。它也可以返回实现该接口的任何其他类型,尽管它确实是Go 1.15中的struct类型。但这可能会改变,恰恰是因为该函数返回的是接口而不是具体类型。

  1. 如果运行我的代码,您会看到变量'rh'的类型是* http.redirectHandler。对于这样的指针,我无法在http包中找到任何内容。

默认情况下,未呈现未导出标识符的文档(因为无论如何您都无法使用它们)。将m=all添加到查询字符串以显示它们:https://golang.org/pkg/net/http/?m=all#redirectHandler

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。