3 回答
TA贡献1856条经验 获得超5个赞
虽然@icza 的回答为您提供了不应该这样做的理由,但这里有一种方法可以使用reflectand unsafe:
var t pkg.T
v := reflect.ValueOf(&t).Elem()
f := v.FieldByName("t")
rf := reflect.NewAt(f.Type(), unsafe.Pointer(f.UnsafeAddr())).Elem()
rf.MethodByName("Print").Call(nil)
游乐场: https: //play.golang.org/p/CmG9e4Bl9gg
TA贡献2039条经验 获得超8个赞
恐怕你试图做的事情通过反思是不可能的。
下面是 reflect.Call 的实现:
func (v Value) Call(in []Value) []Value {
v.mustBe(Func)
v.mustBeExported()
return v.call("Call", in)
}
如您所见,是否从导出的字段中获得了明确的检查(即mustBeExported()) 。Value
通常没有导出字段是有原因的。如果要操作该字段,则必须使用ExportedStruct结构实现的方法。
如果您可以修改ExportedStruct定义的代码,则可以轻松地Close在其上实现包装器方法。例如:
type ExportedStruct struct{
unexportedResource ExportedType
}
func (e ExportedStruct) Close(){
e.unexportedResource.Close()
}
- 3 回答
- 0 关注
- 226 浏览
添加回答
举报
