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í)符)。

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

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()
}
- 3 回答
- 0 關(guān)注
- 144 瀏覽
添加回答
舉報(bào)