Golang抽象函数,从db获取数据并填充数组

时间:2017-09-30 16:14:38

标签: database generics go reflection go-interface

我想创建一个抽象函数,它从DB获取数据并通过此数据填充数组。数组的类型可以不同。由于性能问题,我希望在没有反映的情况下这样做。 我只想调用一些像GetDBItems()这样的函数,并从DB中获取所需类型的数据。但是我创建的所有实现都是有用的。

以下是此功能实现:

MyConnection connec = new MyConnection ();

connec.setUrl("http://testServoce/addUser");
connec.setPost(true);
connec.setContentType("application/json");

InfiniteProgress prog = new InfiniteProgress();
Dialog dlg = prog.showInifiniteBlocking();
connec.setDisposeOnCompletion(dlg);

NetworkManager.getInstance().addToQueueAndWait(connec);

我在这里称之为:

type AbstractArrayGetter func(size int) []interface{}

func GetItems(arrayGetter AbstractArrayGetter) {
    res := DBResponse{}
    DB.Get(&res)
    arr := arrayGetter(len(res.Rows))
    for i := 0; i < len(res.Rows); i++ {
        json.Unmarshal(res.Rows[i].Value, &obj[i])
    }
}

它可以工作,但是有很多代码可以调用这个函数,还有一些关于将事件数组复制到接口数组的性能问题。

如何在不反映的情况下完成并使用短函数调用代码执行此操作?或者反映在这种情况下不要放慢?

1 个答案:

答案 0 :(得分:0)

我用反射测试了性能,它类似于上面提到的解决方案。如果有人需要,这里有反映的解决方案。此函数从DB获取数据并填充抽象数组

func GetItems(design string, viewName string, opts map[string]interface{}, arrayType interface{}) (interface{}, error) {
    res := couchResponse{}
    opts["limit"] = 100000
    bytes, err := CouchView(design, viewName, opts)
    if err != nil {
        return nil, err
    }
    err = json.Unmarshal(bytes, &res)
    if err != nil {
        return nil, err
    }
    dataType := reflect.TypeOf(arrayType)
    slice := reflect.MakeSlice(reflect.SliceOf(dataType), len(res.Rows), len(res.Rows))
    for i := 0; i < len(res.Rows); i++ {
        if opts["include_docs"] == true {
            err = json.Unmarshal(res.Rows[i].Doc, slice.Index(i).Addr().Interface())
        } else {
            err = json.Unmarshal(res.Rows[i].Value, slice.Index(i).Addr().Interface())
        }
        if err != nil {
            return nil, err
        }
    }
    x := reflect.New(slice.Type())
    x.Elem().Set(slice)
    return x.Interface(), nil
}

使用此功能获取数据:

var e Event
res, err := GetItems("data", "data_list", map[string]interface{}{}, e)