is this what you are looking for ? https://play.golang.org/p/_g2AbX0yHV
see also the related so for what I fund interesting http://stackoverflow.com/questions/40060131/reflect-assign-a-pointer-struct-value On Tuesday, November 8, 2016 at 4:07:56 AM UTC+1, Kaylen Wheeler wrote: > > Here's what I have so far: https://play.golang.org/p/X2z7Yl9UPg > > I think it works for my purposes. However, I'm confused about one thing: > Why does reflect.Value.Set panic when passed a zero-value? > > > On Monday, 7 November 2016 16:56:52 UTC-8, freeformz wrote: >> >> Then just use pointers (see lines 45+): >> https://play.golang.org/p/vl47WDHOdN >> >> On Mon, Nov 7, 2016 at 4:50 PM Kaylen Wheeler <kfjwh...@gmail.com> wrote: >> >>> I want pointers because I want most components to be structs, and I want >>> the ability to modify the fields in those structs. >>> >>> On Monday, 7 November 2016 16:46:17 UTC-8, freeformz wrote: >>> >>>> Why do you want to use pointers? >>>> >>>> On Mon, Nov 7, 2016 at 4:42 PM Kaylen Wheeler <kfjwh...@gmail.com> >>>> wrote: >>>> >>> Thanks for the "basic pattern" example here. There's one little >>>>> modification I'm wondering about. >>>>> >>>>> Can this line: >>>>> >>>>> rv.Elem().Set(m[rv.Type()]) >>>>> >>>>> be changed to this? >>>>> >>>>> rv.Elem().Set(*&*m[rv.Type()]) >>>>> >>>>> If so, how can we check that the input value is a pointer to a pointer. >>>>> >>>>> Or alternatively, is it better that the values in m should be pointers? >>>>> >>>>> >>>>> On Monday, 7 November 2016 16:01:53 UTC-8, adon...@google.com wrote: >>>>>> >>>>>> On Monday, 7 November 2016 17:55:57 UTC-5, Kaylen Wheeler wrote: >>>>>>> >>>>>>> I'm trying to find a typesafe way to access a type-indexed map of >>>>>>> components. This map can contain objects of any type, and the keys are >>>>>>> reflect.Type. >>>>>>> >>>>>>> One strategy I thought may work would be to pass a pointer to a >>>>>>> pointer as an out-var. Using reflection to determine the pointer's >>>>>>> type, >>>>>>> it could be populated with a corresponding value. >>>>>>> >>>>>>> For instance, if we did something like this: >>>>>>> >>>>>>> c := ComponentCollection{} >>>>>>> c.addComponent(123) // Add an int component >>>>>>> >>>>>>> var p : *int >>>>>>> c.getComponent(&p) >>>>>>> >>>>>>> >>>>>>> In this case, p would point to the int component of c. >>>>>>> >>>>>>> That's wht the 2 levels of indirection are necessary: it's an >>>>>>> out-var to a pointer. >>>>>>> >>>>>>> Does that make sense? >>>>>>> >>>>>> >>>>>> Here's the basic pattern: >>>>>> >>>>>> var m = make(map[reflect.Type]reflect.Value) >>>>>> >>>>>> func addComponent(x interface{}) { >>>>>> v := reflect.ValueOf(x) >>>>>> m[v.Type(x)] = v >>>>>> } >>>>>> >>>>>> func getComponent(ptr interface{}) { >>>>>> rv := reflect.ValueOf(ptr) >>>>>> if rv.Kind() != reflect.Pointer { >>>>>> panic("not a pointer") >>>>>> } >>>>>> rv.Elem().Set(m[rv.Type()]) >>>>>> } >>>>>> >>>>> -- >>>>> 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. >>>> >>>> >>>>> 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...@googlegroups.com. >>> 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.