On Fri, Aug 11, 2017 at 2:51 PM, Josh Humphries <jh...@bluegosling.com> wrote: > > It is possible to extract a map's actual value/address if it is stored in > the heap -- by using something like this: > atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(&m))) > However, it does not appear to possible to go the other direction, even if > using unsafe. Specifically, to take an unsafe.Pointer and somehow store it > in a variable whose type is a map.
var m map[int]bool *(*unsafe.Pointer)(unsafe.Pointer(&m)) = myMapPointer > My use case wants to be able to lazily compute the map, but then use > atomic.StoreX to safely set the field value for a struct that could be > accessed from multiple goroutines. (Readers would, of course, use > atomic.LoadX). > > But it doesn't look like this is possible. And I cannot use atomic.Value > because I need the structs to be copy-able. I can't copy a struct with > atomic.Value nested in it because it embeds the special noCopy type. (I know > the compiler will allow the copy, but I want to do this in a library and > don't want users of the library to see errors reported by "go vet" due to > copying this type.) > > My current solution is to add another pointer indirection -- so I stick the > map in a struct, and then I can use atomic.LoadPointer and > atomic.StorePointer to atomically change a pointer to that struct. > > But that seemed a little silly since. Though the language spec does not > describe maps as pointers, blog posts describe them as reference types and > the doc for reflect.Value.Pointer() implies that they are (same for > channels). > > > Is there a particular reason that casting a map (or chan) to unsafe.Pointer, > and vice versa, is disallowed? We're already using the unsafe package, so I > can't think of a clear reason to prevent this. >From a language perspective, there is no reason to lock map and channel values into always being pointer values. 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.