> 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.