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

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

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

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

Go
牛魔王的故事 2022-04-20 20:55:06
我知道,有人問(wèn)過(guò)類似的問(wèn)題,但我沒(méi)有找到該案例的答案: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())}),這導(dǎo)致reflect.flag.mustBeExported using value obtained using unexported field。這很煩人,因?yàn)槲蚁脒\(yùn)行多個(gè)使用 的測(cè)試ExportedStruct,但只要不使用底層資源,我就不能。由于我可以訪問(wèn)私有字段(如此處所述),我有點(diǎn)希望我也被允許以某種方式訪問(wèn)該字段的公共方法。也許我只是反映錯(cuò)了?
查看完整描述

3 回答

?
子衿沉夜

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

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

鏈接的答案只能通過(guò)使用 package 來(lái)訪問(wèn)它unsafe,這不是日常使用的。包裝unsafe應(yīng)隨附“請(qǐng)勿觸摸”手冊(cè)。

如果確實(shí)需要訪問(wèn)unexportedResource,請(qǐng)將其導(dǎo)出。無(wú)論是字段,還是向調(diào)用的類型添加方法unexportedResource.Close()?;蛘邔?shí)用程序函數(shù)添加到執(zhí)行此操作的包中(同一包中的函數(shù)可以訪問(wèn)未導(dǎo)出的字段和標(biāo)識(shí)符)。


查看完整回答
反對(duì) 回復(fù) 2022-04-20
?
RISEBY

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

雖然@icza 的回答為您提供了不應(yīng)該這樣做的理由,但這里有一種方法可以使用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)

游樂(lè)場(chǎng): https: //play.golang.org/p/CmG9e4Bl9gg


查看完整回答
反對(duì) 回復(fù) 2022-04-20
?
largeQ

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

恐怕你試圖做的事情通過(guò)反思是不可能的。


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


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

    v.mustBe(Func)

    v.mustBeExported()

    return v.call("Call", in)

}

如您所見(jiàn),是否從導(dǎo)出的字段中獲得了明確的檢查(即mustBeExported()) 。Value


通常沒(méi)有導(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ù) 2022-04-20
  • 3 回答
  • 0 關(guān)注
  • 144 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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