dtvpl739577 2015-11-27 06:18
浏览 257

如何在go中将map的切片转换为struct的切片?

I am trying to convert to map to struct, I am almost done, finally I got a problem, I can not convert slice to struct:

func readDocTo(in bson.M, out reflect.Value) {
    outt := out.Type()
    outk := outt.Kind()

    for {
        if outk == reflect.Ptr && out.IsNil() {
            out.Set(reflect.New(outt.Elem()))
        }
        if outk == reflect.Ptr {
            out = out.Elem()
            outt = out.Type()
            outk = out.Kind()
            continue
        }
        break
    }

    st := out.Type()
    n := st.NumField()
    for i := 0; i < n; i++ {
        field := st.Field(i)
        if field.PkgPath != "" {
            continue // Private field
        }
        tag := field.Tag.Get("bson")
        if tag == "" && strings.Index(string(field.Tag), ":") < 0 {
            tag = string(field.Tag)
        }
        if tag == "-" {
            continue
        }

        // XXX Drop this after a few releases.
        if s := strings.Index(tag, "/"); s >= 0 {
            recommend := tag[:s]
            for _, c := range tag[s+1:] {
                switch c {
                case 'c':
                    recommend += ",omitempty"
                case 's':
                    recommend += ",minsize"
                default:
                    msg := fmt.Sprintf("Unsupported flag %q in tag %q of type %s", string([]byte{uint8(c)}), tag, st)
                    panic(externalPanic(msg))
                }
            }
            msg := fmt.Sprintf("Replace tag %q in field %s of type %s by %q", tag, field.Name, st, recommend)
            panic(externalPanic(msg))
        }

        if tag == "" {
            tag = strings.ToLower(field.Name)
        }

        fieldt := field.Type
        val, ok := in[tag]
        switch fieldt.Kind() {
        case reflect.Ptr:
            if !ok {
                out.Field(i).Set(reflect.New(fieldt.Elem()))
            } else {
                readDocTo(val.(bson.M), out.Field(i))
            }
        case reflect.String:
            if ok {
                out.Field(i).Set(reflect.ValueOf(val))
            }
        case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
            out.Field(i).SetInt(reflect.ValueOf(val).Int())
        case reflect.Slice:
            if ok {
                s := reflect.ValueOf(val)
                for j := 0; j < s.Len(); j++ {
                    item := s.Index(j)
                    fmt.Println(item.Interface().(bson.M))
                    fmt.Println(out.Field(i))
                    // TODO
                    // readDocTo(item.Interface().(bson.M), out.Field(i).Elem())
                }
            }
        }

    }
}
  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥20 数学建模,尽量用matlab回答,论文格式
    • ¥15 昨天挂载了一下u盘,然后拔了
    • ¥30 win from 窗口最大最小化,控件放大缩小,闪烁问题
    • ¥20 易康econgnition精度验证
    • ¥15 msix packaging tool打包问题
    • ¥28 微信小程序开发页面布局没问题,真机调试的时候页面布局就乱了
    • ¥15 python的qt5界面
    • ¥15 无线电能传输系统MATLAB仿真问题
    • ¥50 如何用脚本实现输入法的热键设置
    • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能