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 > <javascript:>> 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+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.