如何在go中调用未导出的类'方法

时间:2017-08-07 10:01:37

标签: go private

我想在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

有没有解决方案?

1 个答案:

答案 0 :(得分:1)

TLDR 您没有。这就是不出口东西的重点;防止直接访问它们。

话虽如此,这个问题听起来很像XY Problem。也许如果你能解释你想要实现的目标,我们可以提出另一种方法。

更长的答案

这可以通过反射实现(当你正在尝试时)。这应该只在绝对最罕见的情况下进行,即便如此。

为此,请提供完整,可重复的示例。您包含的代码无法编译,因此无法进行调试。

相关问题