On 28 November 2017 at 16:30, Henrik Johansson <dahankz...@gmail.com> wrote: > Ok, thanks for the clarification. > > Is there some way to reliably handle these situations? > I really like the idea of custom value types as keys.
As I did in my play.golang.org link, and others have pointed out too, you can do it by implementing UnmarshalText on the pointer type, not the value type. https://play.golang.org/p/VQPBwnh4Jn cheers, rog. > > > On Tue, Nov 28, 2017, 5:22 PM roger peppe <rogpe...@gmail.com> wrote: >> >> > What tripped me up aside from reusing the map in the example was that in >> > case of errors a value type will still be put in the with it's default >> > value >> > which my or may not for me. >> >> The reason for that is that your UnmarshalText method was being called >> on a pointer to the zero value, >> but was a value method, so the value was copied (all value methods are >> implemented by pointer >> values too), then your method couldn't change the original value, so >> the JSON unmarshaler >> just saw the zero value unchanged. >> >> On 28 November 2017 at 16:10, Henrik Johansson <dahankz...@gmail.com> >> wrote: >> > The time example I have was just an example. >> > I have a trivial struct as key. >> > >> > What tripped me up aside from reusing the map in the example was that in >> > case of errors a value type will still be put in the with it's default >> > value >> > which my or may not for me. I avoided the whole thing by just using >> > strings >> > as the key. A bit less typed but not unmanageable. >> > >> > Thanks for clarifying everyone! >> > >> > >> > On Tue, Nov 28, 2017, 3:34 PM Marvin Renich <m...@renich.org> wrote: >> >> >> >> * Henrik Johansson <dahankz...@gmail.com> [171128 07:43]: >> >> > But wouldn't unmarshal just overwrite in case of more trivial keys? >> >> > >> >> > So pointer receivers on the marshaling methods is better. >> >> > I think I tried it but something else blew up. >> >> >> >> While MarshalText can use a value or pointer receiver, it makes no >> >> sense >> >> to use a value receiver with UnmarshalText. The UnmarshalText method >> >> must be able to change the caller's copy of the variable that is to >> >> hold >> >> the unmarshalled data. >> >> >> >> As for time.Time, if you read its documentation, it says that it holds >> >> both a wall clock time and a monotonic time. time.Now() returns a >> >> structure that has both values, but some operations (e.g. time.Parse >> >> and >> >> time.Time.UnmarshalJSON) return a time.Time that only has a wall clock >> >> time. t.Round(0) is the canonical way to strip the monotonic time from >> >> a time.Time value t. >> >> >> >> So after t := time.Now(); t2 := t.Round(0), t and t2 represent the same >> >> wall clock time, but compare as different, because the t has both wall >> >> clock and monotonic times, whereas t2 only has wall clock time. >> >> >> >> So your map with key time.Now() has a key with both times. When you >> >> marshal it, the marshalled value only has wall clock time. When you >> >> unmarshal it back to the same map, the unmarshalled time is different >> >> (but represents the same wall clock time) from the existing map key, so >> >> it creates an additional map element with the new key. >> >> >> >> If you create your map with keys that only have wall clock times with >> >> UTC location, as in https://play.golang.org/p/BCB3TAZADB, the >> >> unmarshalled key will match the existing key and overwrite it. If you >> >> remove either .UTC() or .Round(0) or both from that code, you will >> >> notice that the map keys are different, and you end up with two values >> >> in the map after unmarshalling. >> >> >> >> ...Marvin >> >> >> >> -- >> >> 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. >> > >> > -- >> > 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. -- 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.