标题超长了,应该是 struct转map[interface{}]interface{}。
最近比较慵懒,工作也忙成一坨,也没理清思路来写这比较重要的一个环节。
先简单说几个点,后面有时间再补充。认知有限,不一定对。
前面写了go-flutter插件如果传递参数,但是只是简单类型的参数。
结构体之类的,如何从go传递到flutter,这个也是有些麻烦。
go-flutter也是利用MethodChannel来传递消息,我只试了StandardMethodCodec{}这个。
go的struct需要转换成map才能被flutter正确接收(认知有限,不一定对)。
go中的struct转成map[string]interface{}比较简单,但是问题来了。
go-flutter的StandardMethodCodec{} 不支持map[string]interface{},支持map[interface{}]interface{}。
所以把go的map通过go-flutter传递给flutter时,还需要在go这边把map[string]interface{}转换成map[interface{}]interface{},flutter才能正确接收。
自己写了几个不一定好用的方法来实现go的从struct转换成map[interface{}]interface{}。
一 将struct转化为map
此函数将struct转为map[string]interface{}
// 将struct转化为map
// 》使用json
func StrctToMap(s interface{}) (map[string]interface{}, error) {
m := make(map[string]interface{})
j, err := json.Marshal(s)
if err != nil {
log.Print("Error occurs when convert struct to map. function: StrctToMap() -> json.Marshal()")
return m, err
}
err = json.Unmarshal(j, &m)
if err != nil {
log.Print("Error occurs when convert struct to map. function: StrctToMap() -> json.Unmarshal()")
return m, err
}
return m, nil
}
二 将string类型Key的Map转化为interface{}类型Key的Map
此函数将map[string]interface{}转为map[interface{}]interface{}
// 将string类型Key的Map转化为interface{}类型Key的Map
// 》interface{}类型Key的Map用于go-flutter插件
func ToIfKeyMap(m map[string]interface{}) (result map[interface{}]interface{}, err error) {
result = make(map[interface{}]interface{})
for k, v := range m {
kindTmp := reflect.ValueOf(v).Kind()
if kindTmp == reflect.Slice {
vSlice, ok := v.([]interface{})
if !ok {
return result, errors.New("Error occurs when reflect slice.")
}
// 用于存放Map的切片
var valSlice []interface{}
for _, subVal := range vSlice {
// 切片元素为Map类型
if reflect.ValueOf(subVal).Kind() == reflect.Map {
itemMap, itemOk := subVal.(map[string]interface{})
if itemOk {
ifKeyMap, err := ToIfKeyMap(itemMap)
if err != nil {
return nil, err
}
valSlice = append(valSlice, ifKeyMap)
}
} else { // 非Map类型(认为是普通类型)
valSlice = append(valSlice, subVal)
}
}
result[k] = valSlice
} else if kindTmp == reflect.Map {
tmpMap := make(map[interface{}]interface{})
for k2, v2 := range v.(map[string]interface{}) {
tmpMap[k2] = v2
}
result[k] = tmpMap
} else {
result[k] = v
}
}
return result, nil
}
三 将struct转化为interface{}类型Key的Map
此函数利用上面两个函数,将struct转为map[interface{}]interface{}
// 将struct转化为interface{}类型Key的Map
// 》interface{}类型Key的Map用于go-flutter插件
func StructToIfKeyMap(s interface{}) (result map[interface{}]interface{}, err error) {
// 先转换成string类型Key的Map
m, err := StrctToMap(s)
if err != nil {
log.Print("Error occurs when convert struct to map with interface key. function: StrctToIfKeyMap() -> StrctToMap()")
return result, err
}
// 再转换成interface类型Key的Map
result, err = ToIfKeyMap(m)
if err != nil {
log.Print("Error occurs when convert struct to map with interface key. function: StrctToIfKeyMap() -> ToIfKeyMap()")
return result, err
}
return result, nil
}
上面三个函数也放在了github上
相关代码(github):
https://github.com/bettersun/moist/blob/main/struct.gogithub.com上面的方法感觉转换效率比较低,等待大神指点一二。
最近脑子比较混乱,先写这么多,后面有时间整理好思路,再来补充。