In my extreme laziness, I created this helper function to lowercase struct names, It does an extra decode/encode, so it is a horrible way to do things, but it works alright for 'fun' code, and is easy to use:
func MapFromStruct(data interface{}) (map[string]string, error) {
jsonw := bytes.NewBuffer(nil)
enc := json.NewEncoder(jsonw)
err := enc.Encode(data)
if err != nil {
return nil, err
}
jsonr := bytes.NewReader(jsonw.Bytes())
dec := json.NewDecoder(jsonr)
kv := map[string]interface{}{}
err = dec.Decode(&kv)
if err != nil {
return nil, err
}
result := map[string]string{}
camelCaseRe := regexp.MustCompile(`[\p{Lu}][\p{Ll}]*`)
for k, v := range kv {
words := camelCaseRe.FindAllString(k, -1)
words[0] = strings.ToLower(words[0])
lowerK := strings.Join(words, "")
result[lowerK] = fmt.Sprint(v)
}
return result, nil
}
Then where you used to have:
err := enc.Encode(myStruct)
you can do:
myMap, err := MapFromStruct(myStruct)
if err != nil {
return err
}
It's not something I would let through on a code review, but handy for hacking. I agree I'd like to see a better solution that didn't require me repeat every field name again in tags.
Bill
On Friday, November 30, 2012 12:03:27 AM UTC-8, Artem Redkin wrote: