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

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

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