亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在未導出的字段上調用導出的方法

在未導出的字段上調用導出的方法

Go
牛魔王的故事 2022-04-20 20:55:06
我知道,有人問過類似的問題,但我沒有找到該案例的答案:type ExportedStruct struct{ //comes from a dependency, so I can't change it  unexportedResource ExportedType}我想在. _Close()unexportedResource我所做的是:rs := reflect.ValueOf(myExportedStructPtr).Elem() //myExportedStructPtr is a pointer to an ExportedStruct objectresourceField := rs.FieldByName("unexportedResource")closeMethod := resourceField.MethodByName("Close")closeMethod.Call([]reflect.Value{reflect.ValueOf(context.Background())}),這導致reflect.flag.mustBeExported using value obtained using unexported field。這很煩人,因為我想運行多個使用 的測試ExportedStruct,但只要不使用底層資源,我就不能。由于我可以訪問私有字段(如此處所述),我有點希望我也被允許以某種方式訪問該字段的公共方法。也許我只是反映錯了?
查看完整描述

3 回答

?
子衿沉夜

TA貢獻1828條經驗 獲得超3個贊

未導出的字段僅用于聲明包。別再惹他們了。它們不適合你。

鏈接的答案只能通過使用 package 來訪問它unsafe,這不是日常使用的。包裝unsafe應隨附“請勿觸摸”手冊。

如果確實需要訪問unexportedResource,請將其導出。無論是字段,還是向調用的類型添加方法unexportedResource.Close()?;蛘邔嵱贸绦蚝瘮堤砑拥綀绦写瞬僮鞯陌校ㄍ话械暮瘮悼梢栽L問未導出的字段和標識符)。


查看完整回答
反對 回復 2022-04-20
?
RISEBY

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


查看完整回答
反對 回復 2022-04-20
?
largeQ

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()

}


查看完整回答
反對 回復 2022-04-20
  • 3 回答
  • 0 關注
  • 157 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號