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.

Reply via email to