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.