Ok, I got that, thanks for the clarification! 在 2017年7月28日星期五 UTC+8上午10:36:20,Matt Harden写道: > > Just to be clear, when using unsafe it's possible to do pretty much > anything; reflect by itself doesn't give you this ability. That's by design > AIUI. > > On Wed, Jul 26, 2017 at 6:53 PM feilengcui008 <feilen...@gmail.com > <javascript:>> wrote: > >> Thanks for your answer :), even though the original question has been >> deleted. >> >> I've used the reflect.NewAt to allocate a new memory at the same address >> of the unexported field's reflect.Value, it seems work. >> >> for unexported not nil field >> >> if !v.CanSet() { >> v = reflect.NewAt(v.Type(), unsafe.Pointer(v.UnsafeAddr())).Elem() >> } >> >> >> for unexported nil field >> >> // since v is nil value, v.Elem() will be zero value >> // and zero value is not addressable or settable, we >> // need allocate a new settable v at the same address >> v = reflect.NewAt(v.Type(), unsafe.Pointer(v.UnsafeAddr())).Elem() >> newv := reflect.New(v.Type().Elem()) >> v.Set(newv) >> >> >> >> >> 在 2017年7月26日星期三 UTC+8上午9:08:50,Ian Lance Taylor写道: >> >>> On Sun, Jul 23, 2017 at 12:46 AM, feilengcui008 <feilen...@gmail.com> >>> wrote: >>> > Hi, all: >>> > I'm writing a little fuzz tool for struct using reflect package, >>> and >>> > came across the following case, but didn't find any way to solve it >>> > >>> > >>> > type TestStruct struct { >>> > a *int // unexported nil ptr field, how to modify it? >>> > b int // unexported not ptr field, can be modified using >>> > reflect.NewAt >>> > C *int // exported nil ptr field, can be modified using >>> > reflect.New and value.Set >>> > } >>> > >>> > ts := &TestStruct {} // a is nil ptr and not exported >>> > fieldA := reflect.ValueOf(ts).Elem().Field(0) >>> > // how to modify the value of a using the reflect value fieldA? >>> >>> In general you can not use reflect to set unexported fields. If that >>> were possible, then any package could use reflect to defeat the name >>> hiding used by any other package, which would make name hiding much >>> less useful. >>> >>> Ian >>> >> -- >> You received this message because you are subscribed to the Google Groups >> "golang-nuts" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to golang-nuts...@googlegroups.com <javascript:>. >> For more options, visit https://groups.google.com/d/optout. >> >
-- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.