3 回答

TA貢獻1798條經驗 獲得超3個贊
未導出的字段僅用于聲明包。別再惹他們了。他們不適合你。
鏈接的答案只能通過使用 package 來訪問它unsafe
,這不適合日常使用。包裝unsafe
中應附有“請勿觸摸”手冊。
如果您確實需要訪問unexportedResource
,請將其導出。要么是字段,要么向調用 的類型添加一個方法unexportedResource.Close()
?;蛘呦虬刑砑訄绦写瞬僮鞯膶嵱贸绦蚝瘮担ㄍ话械暮瘮悼梢栽L問未導出的字段和標識符)。

TA貢獻1789條經驗 獲得超10個贊
但這里有一種使用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貢獻1860條經驗 獲得超9個贊
恐怕你想要做的事情通過反思是不可能的。
下面是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 關注
- 199 瀏覽
添加回答
舉報