第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

在未導(dǎo)出的字段上調(diào)用導(dǎo)出的方法

在未導(dǎo)出的字段上調(diào)用導(dǎo)出的方法

Go
達(dá)令說 2023-08-07 19:05:20
我知道,已經(jīng)有人問過類似的問題,但我沒有找到該案例的答案:type ExportedStruct struct{ //comes from a dependency, so I can't change it  unexportedResource ExportedType}我想調(diào)用上的導(dǎo)出方法。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())}),結(jié)果是reflect.flag.mustBeExported using value obtained using unexported field.這是非常煩人的,因?yàn)槲蚁脒\(yùn)行多個(gè)使用 的測試ExportedStruct,但只要不使用底層資源我就不能運(yùn)行。由于我可以訪問私有字段(如此處所述),我有點(diǎn)希望我也可以以某種方式訪問該字段的公共方法。也許我只是反映錯(cuò)誤?
查看完整描述

3 回答

?
呼如林

TA貢獻(xiàn)1798條經(jīng)驗(yàn) 獲得超3個(gè)贊

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

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

如果您確實(shí)需要訪問unexportedResource,請(qǐng)將其導(dǎo)出。要么是字段,要么向調(diào)用 的類型添加一個(gè)方法unexportedResource.Close()。或者向包中添加執(zhí)行此操作的實(shí)用程序函數(shù)(同一包中的函數(shù)可以訪問未導(dǎo)出的字段和標(biāo)識(shí)符)。


查看完整回答
反對(duì) 回復(fù) 2023-08-07
?
至尊寶的傳說

TA貢獻(xiàn)1789條經(jīng)驗(yàn) 獲得超10個(gè)贊

但這里有一種使用reflectand來做到這一點(diǎn)的方法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


查看完整回答
反對(duì) 回復(fù) 2023-08-07
?
慕碼人2483693

TA貢獻(xiàn)1860條經(jīng)驗(yàn) 獲得超9個(gè)贊

恐怕你想要做的事情通過反思是不可能的。


下面是reflect.Call的實(shí)現(xiàn):


func (v Value) Call(in []Value) []Value {

    v.mustBe(Func)

    v.mustBeExported()

    return v.call("Call", in)

}

正如您所看到的,有一個(gè)顯式檢查(即mustBeExported())是否Value從導(dǎo)出字段獲取。


通常,字段不導(dǎo)出是有原因的。如果您想操作該字段,則必須使用該ExportedStruct結(jié)構(gòu)實(shí)現(xiàn)的方法。


如果您可以修改定義的代碼ExportedStruct,則可以輕松地Close在其上實(shí)現(xiàn)包裝方法。例如:


type ExportedStruct struct{

  unexportedResource ExportedType

}


func (e ExportedStruct) Close(){

  e.unexportedResource.Close()

}


查看完整回答
反對(duì) 回復(fù) 2023-08-07
  • 3 回答
  • 0 關(guān)注
  • 193 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)