金庆的专栏

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  372 随笔 :: 0 文章 :: 454 评论 :: 0 Trackbacks
# 数组make参数错误

(金庆的专栏 2020.3)

用 mgo 的 Bulk 接口操作 mongodb 的代码,在 mongodb 4.2 正常,
而连 mongodb 2.6 报错:
```
error parsing element 0 of field documents :: caused by :: wrong type for '0' field, expected object, found 0: null
```

代码如下:
```
func (u *Util) AddUsers(userIDs []int) error {
    docs := make([]interface{}, len(userIDs))
    for _, userID := range userIDs {
        docs = append(docs, dbdoc.UsersDoc{
            UserID:     userID,
        })
    }
    bulk := u.c().Bulk()
    bulk.Insert(docs...)
    _, err := bulk.Run()
    return err
}
```

试着改成如下调用就成功:
```
func (u *Util) AddUsers(userIDs []int) error {
    bulk := u.c().Bulk()
    for _, userID := range userIDs {
        bulk.Insert(dbdoc.UsersDoc{
            UserID:     userID,
        })
    }
    _, err := bulk.Run()
    return err
}
```

而 Insert() 无论是多个还是单个参数,底层实现是一样的。

输入单个如 []int{123} 还是出错.
将 Insert(docs...) 改成 Insert(docs[0]) 时发现元素为空。
最终找到了错误的代码行:
```
-    docs := make([]interface{}, len(userIDs))
+    docs := make([]interface{}, 0, len(userIDs))
```

高版本的mongodb结果正确应该是他忽略了空的文档。

感觉 golang make() 即可以2个参数也可以3个参数调用的设计是个错误。
posted on 2020-03-19 13:38 金庆 阅读(51) 评论(0)  编辑 收藏 引用 所属分类: 3. Golang

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理