【问题标题】:How to invoke unexported class' method in go如何在 go 中调用未导出的类的方法
【发布时间】:2017-08-07 10:01:37
【问题描述】:

我想在net/http/server.go中调用http.Server的newConn方法

func (srv *Server) newConn(rwc net.Conn) *conn {
    c := &conn{
        server: srv,
        rwc:    rwc,
    }
    if debugServerConnections {
        c.rwc = newLoggingConn("server", c.rwc)
    }
    return c
}

尝试使用反射访问但发生错误

conn := ...
server := &http.Server{}

inputs := make([]reflect.Value, 1)
inputs[0] = reflect.ValueOf(conn)
c := reflect.ValueOf(server).MethodByName("newConn").Call(inputs)
panic: reflect: call of reflect.Value.Call on zero Value

goroutine 17 [running, locked to thread]:
reflect.flag.mustBe(0x0, 0x13)
    /usr/local/go/src/reflect/value.go:201 +0xae
reflect.Value.Call(0x0, 0x0, 0x0, 0xc420047d10, 0x1, 0x1, 0x0, 0x0, 0xc4200e82c0)
    /usr/local/go/src/reflect/value.go:300 +0x38

有什么解决办法吗?

【问题讨论】:

    标签: go private


    【解决方案1】:

    TLDR 你不知道。这就是不出口东西的全部意义。以防止直接访问它们。

    话虽如此,这个问题听起来很像XY Problem。或许如果您能解释您想要完成的工作,我们可以建议另一种方法。

    更长的答案

    这可以通过反射来实现(正如您正在尝试的那样)。这应该只在绝对罕见的情况下进行,即使在那时也是如此。

    为了帮助解决这个问题,请提供一个完整的、可重现的示例。您包含的代码无法编译,因此无法调试。

    【讨论】:

    • 他的例子是:reflect.ValueOf(&http.Server{}).MethodByName("newConn").Call([]reflect.Value{}) 一行,它编译。尽管您是对的,但尚不清楚他要完成什么。而且他也不应该做这种事。
    • 我无法在 90 分钟内发布第二个问题。所以稍后将发布具体问题。我正在尝试使用已由父进程传递的已接受套接字文件描述符在子进程中提供 http 服务。 (多进程服务器)父进程是 C++ 服务器并接受 inet 连接。子进程是启动和运行 go 程序时的分叉 C++ 进程。我已成功创建有关传递的文件描述符整数的 net.Conn。但是我在 go http server 中找不到使用文件描述符(或 net.Conn)的正确 http serve 方法。
    • @함치헌 http.Serve 采用 golang.org/pkg/net/#Listener ,这是一个包含 3 个方法围绕 net.Conn 的接口。如果您使用net.Conn 创建实现此接口的结构,则可以将其传递给http.Serve
    • @함치헌 不要发布新问题。编辑这个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    • 2021-07-18
    • 2016-09-06
    • 1970-01-01
    • 2020-11-06
    • 1970-01-01
    • 2012-11-12
    相关资源
    最近更新 更多