2

我的代码贴满了如下功能:

func TransformMapClassA(mapOfIntToClassA map[int]*ClassA) map[string]*ClassA {
  mapOfStringToClassA := make(map[string]*ClassA)
  for id, obj := range mapOfIntToClassA {
    mapOfStringToClassA[fmt.Sprintf("%d" obj.Id)] = obj
  }
  return mapOfStringToClassA
}

为我的应用程序中的每个课程编写一次。我正在这样做,所以我可以 json.Marshal 现有的地图。有没有一种通用的方法可以做到这一点,所以我不必为每个类编写一个函数?我试过做这样的事情:

type Int64JSON int64 `json:",string"`

并在我的原始地图中使用 Int64JSON,但编译器不喜欢类型定义中的 json 标记:(

提前谢谢了!

4

2 回答 2

2

如果您仍想使用反射创建一个从任何类型的映射返回 map[string]interface{} 的函数,您可以执行以下操作:

func TransformMap(m interface{}) (map[string]interface{}, error) {

    v := reflect.ValueOf(m)

    if v.Kind() != reflect.Map {
        return nil, errors.New("Map required")
    }

    result := make(map[string]interface{}, v.Len())

    keys := v.MapKeys()
    for _, k := range keys {
        result[fmt.Sprint(k.Interface())] = v.MapIndex(k).Interface()
    }

    return result, nil
}

操场

于 2013-09-25T13:35:09.193 回答
1

有很多方法可以做到这一点。其中之一是使用泛型map[interface{}]interface{},并具有转换功能,例如:

func stringMap(m map[interface{}]interface{}) map[string]interface{} {
    result := make(map[string]interface{})
    for k, v := range m {
        result[fmt.Sprint(k)] = v
    }
    return result   
}

(在

您也可以使用反射等。

也就是说,在做任何事情之前,我会考虑为真正的类型做这件事是否真的有那么大的负担。正确键入有几个好处(类型检查、读取时不需要断言、性能、内存使用等),而且它的代码量相当少。

于 2013-09-24T16:54:47.690 回答