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

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

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

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

Go
達令說 2023-08-07 19:05:20
我知道,已經有人問過類似的問題,但我沒有找到該案例的答案: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貢獻1798條經驗 獲得超3個贊

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

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

如果您確實需要訪問unexportedResource,請將其導出。要么是字段,要么向調用 的類型添加一個方法unexportedResource.Close()?;蛘呦虬刑砑訄绦写瞬僮鞯膶嵱贸绦蚝瘮担ㄍ话械暮瘮悼梢栽L問未導出的字段和標識符)。


查看完整回答
反對 回復 2023-08-07
?
至尊寶的傳說

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


查看完整回答
反對 回復 2023-08-07
?
慕碼人2483693

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

}


查看完整回答
反對 回復 2023-08-07
  • 3 回答
  • 0 關注
  • 199 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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