我遇到了一个问题,即如何使用附加条件递归地遍历 map[string]interface{}。
1) 如果一个值是一个映射 - 递归调用该方法
2) 如果一个值是一个数组——调用数组的方法
3)如果一个值不是地图 - 处理它。
现在当方法尝试执行时doc.throughMap(mv)
- 发生错误那么如何在reflect
确认值是映射或数组后将某些值转换为所需的类型?
type MapType map[string]interface{}
type ArrayType []interface{}
func (doc *Document) throughMap(docMap MapType) MapType {
for k, v := range docMap {
vt := reflect.TypeOf(v)
switch vt.Kind() {
case reflect.Map:
if mv, ok := v.(map[string]interface{}); ok {
docMap[k] = doc.throughMap(mv)
} else {
panic("error.")
}
case reflect.Array, reflect.Slice:
if mv, ok := v.([]interface{}); ok {
docMap[k] = doc.throughArray(mv)
} else {
panic("error.")
}
default:
docMap[k] = doc.processType(v)
}
}
return docMap
}
堆栈跟踪:
panic: error. [recovered]
panic: error.
goroutine 1 [running]:
encoding/json.(*encodeState).marshal.func1(0xc000074cd0)
/usr/local/go/src/encoding/json/encode.go:301 +0x9a
panic(0x4bd700, 0x4f9b70)
/usr/local/go/src/runtime/panic.go:513 +0x1b9
project-name/package/name.(*Document).throughMap(0xc00000c028, 0xc000060180, 0xc00007e000)
/home/path/to/project/document.go:231 +0x3f4
project-name/package/name.(*Document).convertDocument(0xc00000c028)
/home/path/to/project/document.go:217 +0x33
project-name/pachage/name.(*Document).MarshalJSON(0xc00000c028, 0x4db740, 0xc00000c028, 0x7f3f0f7540c0, 0xc00000c028, 0xc00001c101)
慕妹3242003
慕慕森
相关分类