I'm using macOS Mojave, go 1.12.4

Example: https://play.golang.org/p/uluBecqL6QF
I would expect the key and value in the example to be the same.

If you implement TextMarshaler on a custom string type, the encoder does 
not use the marshaler when encoding map keys of that type. I ran into this 
trying to use bson.ObjectId from the globalsign mgo repo as a key in a map 
and trying to serialize it to JSON. The JSON encoder uses reflection to 
check that the 'kind' of the value is a string, which is true. But it does 
not check if it is a custom string type that has TextMarshaler implemented. 
The JSON encoder code:

encoding/json/encode.go 865-884

func (w *reflectWithString) resolve() error {
   if w.v.Kind() == reflect.String {
      w.s = w.v.String()
      return nil
   }
   if tm, ok := w.v.Interface().(encoding.TextMarshaler); ok {
      buf, err := tm.MarshalText()
      w.s = string(buf)
      return err
   }
   switch w.v.Kind() {
   case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
      w.s = strconv.FormatInt(w.v.Int(), 10)
      return nil
   case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, 
reflect.Uint64, reflect.Uintptr:
      w.s = strconv.FormatUint(w.v.Uint(), 10)
      return nil
   }
   panic("unexpected map key type")
}


Is this intentional?

-- 
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.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/6745c4a2-3d52-46f6-ab8f-000d8a1a3f8d%40googlegroups.com.

Reply via email to